对于写代码的同学,对于异常当然是深恶痛绝,动不动就 NullPointerException,很烦呢。当然如果你写了很久还是对这些常见的异常没有敏感性,那么该反思自己了。
为了减少写代码造成的或者或者我们需要对异常进行操作不至于程序走不下去,那么我们就需要了解它。
Java 异常体系图
这张图,大家应该都或多或少都见过,这基本就是整个 Java 异常体系了。
Throwable
从上图可以看出,Throwable 类是 Java 所有异常类的父类「是异常类的父类,而 Object 是 Java 所有类的父类」。
Error
Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如 OutOfMemoryError 之类,都是 Error 的子类。
Exception
Exception 又分为两类:可检查异常(checked)、不检查异常(unchecked)「除了 RuntimeException,其余都是可检查异常」。
可检查异常(checked)
可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。其中代表性的就是 IOException
当我们在 IDEA 中写下上面的代码,会有下划红线提示,按 alt+enter 会弹出解决方案:
- 在方法上添加 exception 声明
- 用 try-catch 将其包围
就是必须要显示的捕获异常。否则编译不通过
在 IDEA 中使用 ctrl+alt+u :查看当前类的父类情况
不检查异常(unchecked)
不检查异常就是所谓的运行时异常(RuntimeException) ,不必显示捕获。
当然一看就知道必然会发生 NPE,但是由于是运行时异常,所以会通过编译期;运行的时候就报 NPE 了。
同样,我们来看看 NullPointerException 类的父类情况:
对于这种不可检查异常,像 NPE,我们一般会在对象调用前判断此对象是否为空,不为空才执行其方法。
「NPE:空对象试图调用方法」。
总结
以上就是我对于 Java 异常体系的认识,具体细节后面会补充,形成一个专栏吧