在 Java 中,所有的异常都有一个共同的祖先 java.lang
包中的 Throwable
类。Throwable
类有两个重要的子类:
一、定义与性质
- Error:
- Error是Java程序运行中不可预料的非正常情况,通常表示运行应用程序中出现了严重的错误。
- Error错误一般表示代码运行时JVM(Java虚拟机)出现问题,比如
OutOfMemoryError
(内存溢出错误)、NoClassDefFoundError
(类定义未找到错误)等。 - Error错误是不受检异常(unchecked exception),非代码性错误,通常不建议由程序员通过代码来捕获和处理。
- Exception:
- Exception是Java程序运行中可预料的异常情况,程序本身可以捕获并且可以处理的异常。
- Exception分为两类:运行时异常(RuntimeException及其子类)和编译时异常(其他继承自Exception的类,但不包括RuntimeException及其子类)。
- 运行时异常通常是由程序逻辑错误引起的,如
NullPointerException
(空指针异常)、IndexOutOfBoundsException
(下标越界异常)等,这类异常在编译时不会被检查。 - 编译时异常(也称为检查性异常)在编译时就需要被显式地处理,要么使用try-catch捕获,要么在方法签名中使用throws关键字声明抛出,如
IOException
、SQLException
等。
二、处理方式
- Error:
- 由于Error错误通常表示JVM层面的严重问题,因此程序员很难通过代码来恢复或处理这类错误。
- 在实际开发中,遇到Error错误时,更多的是通过日志记录错误信息,以便后续分析和解决。
- Exception:
- 对于Exception异常,程序员可以通过try-catch语句块来捕获并处理异常,从而避免程序因异常而中断执行。
- 对于运行时异常,虽然编译器不要求强制捕获,但建议程序员在编写代码时尽量避免这类异常的发生,因为它们通常是由逻辑错误引起的。
- 对于编译时异常,程序员必须在编写代码时显式地处理它们,以确保程序的健壮性。
三、总结
- 相同点:
- Exception和Error都继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch)。
- 不同点:
- 性质:Error表示程序运行中的严重错误,通常不可预料且难以恢复;而Exception表示可预料的异常情况,程序可以捕获并处理。
- 处理方式:Error错误通常不建议由程序员通过代码来捕获和处理;而Exception异常则可以通过try-catch语句块来捕获并处理。
- 影响范围:Error错误通常影响范围较大,可能导致整个JVM崩溃;而Exception异常则更具体地指向某个方法或代码块中的错误。