Java Throwable.toString() 方法

2025 年 9 月 4 日 | 阅读 6 分钟

在 Java 中,java.lang.Throwable.toString() 方法是一种获取异常或错误简洁描述的内置方式。当我们想快速了解程序出错的摘要时,它常用于日志记录或调试。

语法

它返回此 throwable 的简短描述。结果包含以下内容:

  • 此对象的类名。
  • ": "(一个冒号和一个空格)。
  • 调用此对象的 getLocalizedMessage() 方法的结果。

如果 getLocalizedMessage 返回 null,则只返回类名。

默认情况下,getLocalizedMessage() 方法只是调用 getMessage(),但其主要目的是生成 throwable 的本地化描述。因此,toString() 调用的是 getMessage() 方法,尽管它们的输出经常相同。

注意:Throwable.toString() 方法重写了 Object.toString() 方法。

它是如何工作的?

在 Throwable 的 toString() 方法的默认实现中,组合了两个关键信息来创建字符串。

  • 类名: getClass().getName() 方法提供类名。它指定了 throwable 的具体类型,例如 lang.NullPointerException 或 java.io.IOException。
  • 详细消息: 这是在创建 throwable 时提供的可选字符串消息(例如,new IllegalArgumentException("无效输入"))。此消息提供了有关出错原因的背景信息。
Java Throwable.toString() Method

示例:Throwable.toString() 方法

示例

编译并运行

输出

Using toString(): java.lang.IllegalArgumentException: Input value cannot be negative.
Using getMessage(): Input value cannot be negative.

解释

它展示了 toString() 和 getMessage() 之间的区别。toString() 方法提供了更完整的视图,包括异常类型,而 getMessage() 只返回开发者提供的具体消息。

演示 toString()、getMessage() 和 printStackTrace() 方法用法的 Java 程序

示例

编译并运行

输出

1. Using toString(): java.lang.ArithmeticException: / by zero
2. Using getMessage(): / by zero

3. Using printStackTrace():
java.lang.ArithmeticException: / by zero
    at Main11.main(Main11.java:10)

与其他方法比较

toString() 与 getMessage()

toString(): 它返回一个字符串表示,包括类名和详细消息。

getMessage(): 它只返回详细消息字符串。

toString() 与 printStackTrace()

toString(): 它提供 throwable 的简洁、单行摘要。

printStackTrace(): 它将完整的堆栈跟踪打印到标准错误流。堆栈跟踪包括 toString() 输出以及导致异常的方法调用列表,这对于调试至关重要。

总而言之,toString() 用于快速摘要,getMessage() 用于具体原因,printStackTrace() 用于详细调试历史。

最佳实践和用例

用于日志: e.toString() 是写入日志文件的理想选择。它在一行中提供异常类型和消息。这是必需的,并使日志搜索更快。例如,log.error("发生错误:{}", e.toString());。此格式提供了一个简洁的解决方案以及全面的信息。它描述了发生了什么以及为什么。这对于系统监控至关重要,并帮助开发人员查找和修复错误。

关于用户界面: 在用户界面方面,e.getMessage() 通常是告知用户我们无法完成其请求的原因的更有效方法。它在没有 Java 类名的情况下传递了更易于理解和直接的消息,这对非技术用户来说很令人困惑。例如,用户界面可以使用 e.getMessage() 来通知用户。

调试: 尽管 toString() 提供了摘要,但 e.printStackTrace() 是调试的必备工具。它提供了一个完整的堆栈跟踪,这是导致异常的所有方法调用的时间顺序列表。这对于准确地识别代码中的错误至关重要。

覆盖自定义异常中的 Throwable.toString() 方法

Java 程序员可以通过扩展 Exception 或更专业的 Throwable 子类来创建自己的自定义异常。这样做时,我们会自动继承 toString() 实现。如果需要,我们可以重写它以提供更准确或更全面的字符串表示。

解释

在此示例中,重写的 toString() 方法添加了特定信息。它附加了无效字段名。它首先调用超类的 toString()。它获取默认的 className: message 格式。结果是一个更具信息量的错误消息。它对于调试很有用,而无需手动检查异常对象的属性。这使得代码更具自文档性。这是将上下文直接嵌入错误的好方法。

结论

Throwable 类的 Throwable.toString() 方法在标准错误消息和完整的调试堆栈跟踪之间提供了关键的连接。虽然 getMessage() 为我们提供了用户将从异常中收到的原始消息。toString() 为我们提供了全面的、易于单行阅读的消息,我们可以将其记录或报告给我们的 bug 跟踪器。一些深度调试仍然受益于 printStackTrace() 的使用。

它提供了导致异常的方法调用序列的完整跟踪。最终,熟练的 Java 程序员了解并为每种方法使用其预期目的:toString() 用于简洁、信息丰富的摘要;getMessage() 用于简短的用户反馈;printStackTrace() 用于取证分析。编写可靠、可维护的代码至关重要。

Java Throwable.toString() 选择题

1. e.getMessage() 只给出详细消息,而 e.toString() 更像是为开发人员提供的全面表示。它包含 ______ 以及实际消息。

  1. 行号
  2. 方法名
  3. 异常类型
  4. 堆栈跟踪
 

答案:c)

解释: 主要区别在于 toString() 显示完整的类名,如 java.lang.NullPointerException,而 getMessage() 只是消息字符串本身。


2. 如果 Throwable 对象中没有消息,例如为 null,则 toString() 方法将只给出抛出它的东西的 ______。

  1. 类名
  2. null
  3. 包名
  4. 堆栈跟踪
 

答案: a)

解释: toString() 方法检查消息是否为 null,如果找到,则只返回类名。


3. 当我们捕获异常时,例如某项中断时,我们应该使用 ______ 来打印整个故事。这在调试时显然非常重要。

  1. e.toString()
  2. e.getMessage()
  3. e.getLocalizedMessage()
  4. e.printStackTrace()
 

答案: d)

解释: toString() 只是一个简短的东西,一行。printStackTrace() 是完整的历史记录。这就是我们需要了解异常如何发生的。


4. Throwable 类的默认 toString() 将完整的类名与消息放在一起。这是 ______ 类的一部分。所有错误和异常都是这样做的。

  1. java.lang.Object
  2. java.lang.Exception
  3. java.lang.Error
  4. java.lang.Throwable
 

答案: d)

解释: Java 中的每个异常和每个错误都继承自 Throwable。这就是它们从超类获取 toString() 方法的地方。


5. java.lang.Throwable.toString() 方法通过组合 throwable 的 ______ 和 ______ 消息,并用冒号 ( : ) 分隔,来给出字符串。

  1. 类型,本地化
  2. 类名,详细
  3. 包,摘要
  4. 方法名,错误
 

答案: b)

解释: 默认的 toString() 使用 getClass().getName() 获取类名,并使用 getMessage() 获取消息本身。