JavaSE进阶
9.2.1 异常的分类
Java语言提供了两大类异常,如图9-8:
- 编译时异常(受检异常Checked)
编译时异常:指程序中必须接受检查和处理的异常,由Exception 类表示。
- 运行时异常(非受检异常UnChecked)
运行时异常:程序中可以不接受检查和处理,或致命性错误异常,由RuntimeException类或Error类表示。
图10- 8 异常分类
9.2.2 Throwable
Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。
两个子类的实例,Error 和 Exception,通常用于指示发生了异常情况。通常,这些实例是在异常情况的上下文中新近创建的,因此包含了相关的信息(比如堆栈跟踪数据)。
9.2.3 Error
Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然 ThreadDeath 错误是一个“正规”的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它。
在执行该方法期间,无需在其 throws 子句中声明可能抛出但是未能捕获的 Error 的任何子类,因为这些错误可能是再也不会发生的异常条件。
9.2.4 Exception
Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
应该在程序中尽可能的预知并处理异常。
- checkedException:受检异常。这一类异常,编译时必须对其进行处理,如果不处理,编译不通过。(checked表示编译器检查过已经处理过的)。例如:疲劳必须休息、喝酒必须不能开车、刹车必须好用。
- RuntimeException(uncheckedException):运行时异常(非受检异常)。一类特殊的异常,如被0除、数组下标越界等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序,即交给JVM处理,用户不显式处理。但是应该尽量避免!!!例如:前车急刹车、有人加塞、路口突然窜出的电动车等等。换句话说,出现RuntimeException一定是你的问题,可以不捕获,因为小心点这些异常是可以避免的,例如:数组下标越界异常ArrayIndexOutOfBoundsException,空指针异常NullPointerException,类型转换异常ClassCastException等等。