首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 異常處理:getMessage() 與 toString() 的區別與內部調用關係

     編輯:程式設計疑難解答

代碼場景

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() 完全一致。

源碼級解析(JDK 8)

// 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() 攜帶類名更利於調試。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved