Java 中的默认异常

17 Mar 2025 | 5 分钟阅读

Java 中的异常处理是处理运行时错误的一种有效方法,可以保留应用程序的正常流程。Java 异常处理是一种处理运行时错误(如 ClassNotFoundException、IOException、SQLException、RemoteException 等)的机制。

在 Java 中,异常是在程序执行期间(即运行时)发生的、中断程序指令正常流程的、不希望发生或意外的事件。异常可以被程序捕获和处理。当一个方法中发生异常时,它会创建一个对象。这个对象称为异常对象。它包含有关异常的信息,例如异常的名称和描述以及异常发生时程序的 P> 状态。

为什么会发生异常?

  • 无效的用户输入
  • 设备故障
  • 网络连接丢失
  • 物理限制(磁盘空间不足)
  • 代码错误
  • 打开不可用的文件

错误代表不可恢复的情况,例如 Java 虚拟机 (JVM) 内存不足、内存泄漏、堆栈溢出错误、库不兼容、无限递归等。错误通常超出了程序员的控制范围,我们不应该尝试处理错误。

异常层次结构

所有异常和错误类型都是类 Throwable 的子类,Throwable 是该层次结构的基类。一个分支由 Exception 引导。此类用于用户程序应捕获的异常情况。NullPointerException 是此类异常的一个示例。另一个分支 Error 由 Java 运行时系统 (JVM) 用于指示与运行时环境本身 (JRE) 相关的错误。StackOverflowError 是此类错误的示例。

Default Exception in Java

让我们来讨论上面列出的异常,如下所示

1. 内置异常

内置异常是 Java 库中提供的异常。这些异常适合解释某些错误情况。

2. 检查型异常

检查型异常称为编译时异常,因为这些异常在编译时由编译器检查。

3. 运行时异常

运行时异常与检查型异常正好相反。编译器不会在编译时检查这些异常。简单来说,如果一个程序抛出一个运行时异常,即使我们没有处理或声明它,程序也不会给出编译错误。

4. 用户自定义异常

有时,Java 中的内置异常无法描述特定情况。在这种情况下,用户也可以创建异常,称为用户自定义异常。

Java 中异常处理的优点如下

  • 允许程序完整执行
  • 易于识别程序代码和错误处理代码
  • 错误传播
  • 有意义的错误报告
  • 识别错误类型

打印异常消息的方法

1. printStackTrace() 方法

该方法以 异常名称: 异常描述, P> 堆栈跟踪 的格式打印异常信息。

Exception.java

输出

java.lang.ArithmeticException: / by zero
at Exception.main(File.java:10)

2. toString() 方法

toString() 方法以 异常名称: 异常描述 的格式打印异常信息。

ToString.java

输出

java.lang.ArithmeticException: / by zero

3. getMessage() 方法

getMessage() 方法仅打印异常的描述。

GetMessage.java

输出

Zero

默认异常处理

默认异常处理程序是在未被调用堆栈中的任何异常处理程序捕获的情况下抛出异常时调用的方法。

当方法内发生异常时,该方法会创建一个称为异常对象的对象,并将其交给运行时系统 (JVM)。异常对象包含异常的名称和描述以及异常发生的程序 P> 的当前状态。创建异常对象并在运行时系统中处理它称为抛出异常。可能有一个列表,列出了调用到发生异常的方法的方法。这个有序的方法列表称为调用堆栈。现在将发生以下过程。

  • 运行时系统会搜索调用堆栈以查找包含可以处理发生异常的代码块的方法。代码块称为异常处理程序。
  • 运行时系统从发生异常的方法开始搜索,并按照方法被调用的相反顺序在调用堆栈中进行。P>
  • 如果找到合适的处理程序,它会将发生的异常传递给它。合适的处理程序意味着抛出的异常对象类型与它可以处理的异常对象类型匹配。
  • 如果运行时系统搜索了调用堆栈中的所有方法但找不到合适的处理程序,那么运行时系统会将异常对象交给运行时系统的一部分默认异常处理程序。该处理程序将以以下格式打印异常信息并异常终止程序。

默认异常处理程序定义在 ThreadGroup 类中,其 P> 签名如下

public void uncaughtException(Thread t, Throwable e)

uncaughtException() 方法接受两个参数

  • t - 抛出异常的线程。
  • e - 异常对象。

默认异常处理程序仅将异常类名、异常描述和堆栈跟踪打印到控制台,然后异常终止程序。

这是默认异常示例。

DefaultException.java

输出

Uncaught exception in thread Thread-0
Something went wrong!
[Ljava.lang.StackTraceElement;@1d251891

Java 中的默认异常在异常处理中起着至关重要的作用,但既有好处也有需要考虑的 P> 弊端。

默认异常的优点

简单性

未捕获的异常会自动传播到调用堆栈的 P> 上方,除了默认行为之外,无需显式处理。这对于简单的程序或原型可能很有用。

健壮性

默认异常处理可防止程序默默忽略潜在的关键错误,从而迫使开发人员在某个时候解决它们。

清晰的错误报告

默认处理程序会打印堆栈跟踪,为调试和识别问题 P> 根源提供有价值的信息。

缺点

不可预测性 未经控制的传播可能导致程序意外终止,使调试更具挑战性。

信息有限

线程中的默认异常...消息提供了基本信息,但 P> 缺乏有关具体错误原因的详细信息。

缺乏自定义

默认处理不 P> 提供根据不同类型的异常量身定制响应的机会,这可能会影响用户体验或数据 P> 完整性。