前言
Java异常类(Exception)是用来处理异常程序行为的一组类。在这篇文章中,我将介绍如何使用Java异常类,以及在程序中如何设计Java异常体系。Exception类是Java体系中非常重要的一环,每一个程序员都必须熟悉并掌握它。
Java异常承载的信息量超乎你的想象
Java Exception的结构设计本身就可以提供给开发者非常多的信息(如果开发者可以恰当的利用这一结构)。Exception结构如下图所示:
Throwable
是整个异常结构的父类,它有两个子类,分别是Error
和Exception
Java Error
Error
类代表出现非正常场景,一旦Error
异常出现,整个应用程序可能崩溃。
Java Exception
Exception
和Error
类不同,当这种类型的异常出现时,程序是可以尝试恢复并继续运行的。Exception异常有以下两类,运行时异常(Runtime Exception)和非运行时异常(Not Runtime Exception):
非运行时异常也成为checked异常,这一类异常和Error异常非常类似,二者的区别在于程序在抛出checked exception有更高的几率恢复正常。
Checked 和 Unchecked异常
Checked异常强制开发者在程序中进行处理或再次抛出。如果checked异常被重新抛出,则需要在方法中用throws语法声明该异常。与之相反,Unchecked异常不需要特殊处理。这种设计结构意味着不主动处理的unchecked异常将会被抛到根类。
如何在JAVA中进行异常处理
Java中有两种方式处理异常:在当前方法中处理或者是重新抛出。你可能需要一个父异常处理器,或者是执行一些其它特定逻辑,如进行重试。
如上文所示,我们可以将异常拆分成三类:Checked,Runtime和Error。它们分别在不同的场景下抛出,代表程序可以恢复的程度。最乐观的是Checked异常,Runtime异常相对而言可恢复的可能性更小,最糟糕的是Error类型异常。
在了解了异常的类型后,我们就可以试着回答以下问题:
- 程序当前情况有多糟糕? 问题的原因是什么?
- 如何修复问题?
- 需要重启JVM吗?
- 需要重新编写代码吗?
熟悉异常后意味着我们可以推测程序是哪里出现了问题,并且试着修复它。下面的章节会展示几个经典的异常场景并分析原因(假设程序已经通过了编译自测阶段)