问题:请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别?
《极客时间-Java核心技术面试精讲》
Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行过程中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
Error 是指正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常、不可恢复的状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如 OutOfMemoryError 之类,都是 Error 的子类。
Exception 又分为可检查(checked)异常和非检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。前面我介绍的不可查的 Error,是 Throwable 而不是 Exception。
不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException 之类,通常是可以编码避免的逻辑错误,和我说根据需要来判断是否需要捕获,并不会在编译期强制要求。
以下为个人模拟面试时的回答,谨供参考。
-
Exception 和 Error 都是 Throwable 的子类,都可以被 catch
-
Exception 是程序设计者可以预料的异常,且不会对 JVM 造成严重破坏,需要对其 catch 并进行处理
-
Java API 文档:The class
Exception
and its subclasses are a form ofThrowable
that indicates conditions that a reasonable application might want to catch.
-
-
Error 通常是非常严重的,难以恢复的错误,如 OutOfMemoryError,不应该去 catch 它
-
Java API 文档:An
Error
is a subclass ofThrowable
that indicates serious problems that a reasonable application should not try to catch.
-
Exception 分两大类
- 受检查异常(checked exception),除 RuntimeException 及其子类外的其它 Exception 都是受检查异常,如 IOException,必须在方法处声明抛出,在编译期可查
- 非检查异常(unchecked exception),RuntimeException 及其子类,不需要在方法处声明抛出,如 NullPointerException,可根据实际情况判断是否 catch 处理
不恰当的异常处理
- 全部 catch Exception 这类顶级异常,不针对特定异常做处理
- 生吞异常,导致程序可能出现奇怪的问题,且出错后排查困难