Java Throwable 类

2025 年 6 月 16 日 | 阅读 6 分钟

在 Java 中,Throwable 类位于可以作为错误或异常抛出的所有对象的层次结构的顶端。它属于 java.lang 包,是可能中断程序流程的所有问题的父类。当我们使用 throw 关键字时,被抛出的对象必须是 Throwable 的子类。它作为所有异常 (Exception) 和错误 (Error) 的根类,从而使 Java 的异常处理机制能够高效运行。

  • 异常 (Exceptions): 这些是在程序执行期间可能发生的问题,但通常是程序可以捕获并从中恢复的问题,例如尝试打开一个不存在的文件。
  • 错误 (Errors): 这些是更严重的问题,通常与程序运行的环境有关,例如内存不足。这些通常不应由常规应用程序代码捕获或处理。

Java Throwable 类在创建时捕获调用堆栈,并可以包含一条描述问题的消息。它还支持抑制其他错误。虽然扩展 Exception 更常见,但我们可以通过直接扩展 Throwable 类来创建自定义的 throwable,以进行专门的错误处理。

Throwable 类示例

示例

编译并运行

输出

Caught custom throwable: An error triggered inside the test method.
Runtime Error:
MyThrowable: An error triggered inside the test method.
	at Main.test(Main.java:11)
	at Main.main(Main.java:16)

为什么 Throwable 类很重要?

它很重要,因为 Throwable 是 Java 中所有可抛出对象的根类;它定义了所有异常和错误继承的基本结构和行为。它包含用于以下目的的方法:

  • 存储消息和原因
  • 打印堆栈跟踪
  • 抑制异常
  • 捕获堆栈跟踪元素

Throwable 类构造函数

Java 中的 Throwable 类提供了多种创建错误或异常对象的方法,具体取决于我们的需求。与大多数 Java 类一样,它包含不同类型的构造函数,有些带参数,有些不带参数。

构造函数描述
throwable()这是最基本的构造函数。它不接受任何参数,只创建一个没有特定消息的 Throwable 对象。当我们想抛出一个错误但没有额外的详细信息要添加时,它很有用。
throwable(String message)这个版本允许我们包含一条自定义消息。例如,如果出现问题,我们可以提供一个简短的问题说明。这条消息在以后调试时会非常有帮助。
throwable(String message, Throwable cause)有时一个错误会导致另一个错误。这个构造函数允许我们一次做两件事:提供我们自己的消息,并链接到导致它的原始问题。这有助于追踪我们程序中发生问题的完整过程。
throwable(Throwable cause)在这种情况下,我们只传入触发当前 Throwable 的另一个 Throwable 的原因。新 throwable 的消息会自动从其原因中获取。当我们只是包装另一个错误而不需要新的解释时,它很方便。
Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)它为我们提供了对 throwable 如何行为的高级控制。

Java Throwable 类方法

方法描述
getMessage()该方法返回此 throwable 的详细消息字符串。
getSuppressed()该方法返回一个数组,其中包含所有被抑制的异常,通常是由 try-with-resources 语句为了传递此异常而抑制的。如果没有任何异常被抑制,或者抑制被禁用,则返回一个空数组。此方法是线程安全的。对返回数组的写入不会影响此方法将来的调用。
getStackTrace()该方法提供对 printStackTrace() 打印的堆栈跟踪信息的程序化访问。返回一个堆栈跟踪元素数组,每个元素代表一个堆栈帧。数组的零个元素(假定数组长度非零)代表堆栈的顶部,这是调用序列中的最后一个方法调用。
fillInStackTrace()该方法填充执行堆栈跟踪。此方法在此 Throwable 对象中记录当前线程的堆栈帧的当前状态信息。

 

如果此 Throwable 的堆栈跟踪是不可写的,则调用此方法无效。

getLocalizedMessage()该方法创建一个此 throwable 的本地化描述。子类可以覆盖此方法以生成特定于语言环境的消息。对于不覆盖此方法的子类,默认实现返回的结果与 getMessage() 相同。
initCause()该方法将此 throwable 的原因初始化为指定的值。(原因是由此 throwable 被抛出的原因 throwable。)

 

此方法最多只能调用一次。它通常在构造函数内部调用,或者在创建 throwable 后立即调用。如果此 throwable 是使用 Throwable(Throwable) 或 Throwable(String, Throwable) 创建的,则不能调用此方法一次。

getCause()该方法返回此 throwable 的原因,如果原因不存在或未知,则返回 null。(原因是由此 throwable 被抛出的原因 throwable。)
printStackTrace()该方法将此 throwable 及其回溯打印到标准错误流。此方法将此 Throwable 对象 onto 字段 System.err 的错误输出流上打印堆栈跟踪。输出的第一行包含此对象的 toString() 方法的结果。其余行代表由 fillInStackTrace() 方法先前记录的数据。
addSuppressed()该方法将指定的异常追加到为传递此异常而抑制的异常列表中。
setStackTrace()该方法设置将由 getStackTrace() 返回以及由 printStackTrace() 和相关方法打印的堆栈跟踪元素。此方法专为 RPC 框架和其他高级系统使用而设计,允许客户端覆盖由 throwable 构造时 fillInStackTrace() 生成的默认堆栈跟踪,或在从序列化流读取 throwable 时反序列化的堆栈跟踪。
toString()该方法返回此 throwable 的简短描述。结果是以下内容的串联:此对象的类名,": "(一个冒号和一个空格),以及调用此对象的 getLocalizedMessage() 方法的结果。

Java Throwable 选择题

1. 在 Java 中,哪个类位于所有错误和异常的层次结构的顶端?

  1. Exception
  2. Error
  3. Throwable
  4. RuntimeException
 

答案:3

解释:在 Java 中,Throwable 是位于所有错误和异常的层次结构顶端的超类。它作为所有异常 (Exception) 和错误 (Error) 的根类,使 Java 的异常处理机制能够高效运行。


2. 调用 Throwable 对象的 fillInStackTrace() 方法时会发生什么?

  1. 它会清除当前的堆栈跟踪
  2. 它会更新堆栈跟踪以反映代码中的当前位置
  3. 它返回错误消息的字符串
  4. 它会删除异常的原因
 

答案:2

解释:当你对 Throwable 对象调用 fillInStackTrace() 方法时,它会重置该异常的堆栈跟踪信息,以反映当前的执行状态。换句话说,它会用一个新的堆栈跟踪替换现有的堆栈跟踪,该堆栈跟踪代表调用 fillInStackTrace() 的位置。


3. 如果没有为 Throwable 设置原因,getCause() 方法将返回什么?

  1. 一个字符串 "null"
  2. 一个新的 Throwable 对象
  3. 什么都没有 - 它会抛出异常
  4. NULL
 

答案:4

解释:如果 Throwable 没有明确设置原因,getCause() 方法将返回 null。


4. Throwable 中有一个构造函数,允许你控制是否启用抑制以及堆栈跟踪是否可修改。是哪个?

  1. Throwable()
  2. Throwable(String message)
  3. Throwable(Throwable cause)
  4. Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)
 

答案:4

说明

enableSuppression:控制异常是否可以具有被抑制的异常(在 try-with-resources 中很有用)。

writableStackTrace:确定堆栈跟踪是否可修改。


5. 当在 Throwable 上调用 getSuppressed() 时,它返回什么类型的值?

  1. 错误消息列表
  2. 被抑制的异常数组
  3. 堆栈跟踪本身
  4. 只是根原因异常
 

答案:2

解释:Java 中的 getSuppressed() 方法返回一个被抑制的异常数组 (Throwable[])。如果没有抑制任何异常,它将返回一个空数组而不是 null。