class FuShuException extends Exception {
private String str;
FuShuException(String str) { this.str = str; }
public String getMessage() { return str; }
// 未重寫 toString()
}
try {
// ...
} catch (FuShuException e) {
System.out.println(e.toString()); // 輸出同 getMessage()
}
Throwable.toString() 內部調用了 getLocalizedMessage(),而後者默認實現返回 getMessage() 的結果。因此未重寫 toString() 時,輸出內容與 getMessage() 完全一致。
// java.lang.Throwable
public String toString() {
String s = getClass().getName();
String message = getLocalizedMessage(); // 關鍵點
return (message != null) ? (s + ": " + message) : s;
}
public String getLocalizedMessage() {
return getMessage(); // 默認委托給 getMessage()
}
| 調用方式 | 輸出示例 |
|---|---|
e.getMessage() | 除數為負數,運算失敗 |
e.toString() | FuShuException: 除數為負數,運算失敗 |
System.out.println(e) | FuShuException: 除數為負數,運算失敗(隱式調用 toString) |
e.getMessage()e.toString() 或直接 logger.error("", e)getMessage() 和 toString(),確保語義清晰。一言以蔽之:toString() = 類名 + ": " + getMessage()。未重寫時兩者語義等價,但 toString() 攜帶類名更利於調試。