Java 异常处理
首先,Java中进行异常处理的目的是使用异常提供一致的错误报告类型(异常是Java中唯一正式的错误报告机制),使得系统能够与客户端代码可靠的沟通问题;其次,通过异常处理可以提供错误的恢复机制,从而提高系统的健壮性;另外,异常处理可以将错误处理的代码从错误发生的地方分离出来,从而在这段代码中专注要完成的事情,而在另一段代码中专注如何处理错误。
换句话说,异常可以允许我们强制程序停止运行,并告诉我们出现了什么问题,或者强制程序处理问题并返回到稳定的状态。
异常抛出
当前环境无法获得必要的信息来解决问题时,就必须从当前环境跳出并把问题交给上一级去处理,这时便需要抛出异常。
当抛出异常时,有几件事情会随之发生。首先,使用new在堆上创建对象。然后当前的执行路径被终止,并从当前环境弹出异常对象的引用。此时异常处理机制接管程序,开始进入到异常处理程序,而异常处理程序的任务就是从错误状态中恢复,以使程序要么换一种方式运行,要么继续执行下去。
通过throw
可以抛出任意类型的throwable
对象(它是异常类型的根类),通过new创建一个异常对象后,将此对象的引用传给throw即可。这里可以将抛出异常看作是一种特殊的方法返回,尽管返回的异常类型通常和方法设计的返回类型并不一致。
throw new NullPointerException();
捕获异常
使用try{}catch(){}finally{}
进行捕获和处理异常,需要注意的是可以有多个catch
子句,每个子句捕获某一种异常,异常处理机制将按照顺序搜索第一个匹配的异常并进行处理,并且派生类的对象也可以匹配其基类的处理程序。
创建自定义异常
通常创建自定义异常非常简单,只需要如下一行代码即可,没有必要新增属性或者创建自定义构造器,最重要的是给自定义异常起一个含义明确的名称,这样大多数情况下就已经够用了。
class MyException extends Exception {}
继承的这个标准异常类有两个构造函数,一个是默认构造器,还有一个可以接受字符串参数的构造器,以便能够把一些相关信息放入异常对象。
Java异常类型
Throwable
是异常类型的根类,表示任何可以被异常抛出的类。一般分为两种类型:Error
和Exception
。前者用来表示编译时和系统错误,一般使用ide的话,编辑器里就直接报错了,因此这种异常一般不需要关心(因为很容易避免)。而真正需要程序员关心的通常是Exception
。
运行时异常RuntimeException
会自动被Java虚拟机抛出,也成为不受检查异常
,例如NullPointerException
,这些异常不需要在方法的异常说明中将其列出来,这些异常一般属于错误,将被自动抛出并且自动将异常输出报告给System.err
。究其原因,其实RuntimeException
代表的就是需要及时处理的编程错误,这些默认行为给调试带来了便利。
什么时候应该使用异常
- 解决问题并且重新调用产生异常的方法
- 进行少许修补,然后绕过异常发生的地方继续执行
- 用别的途径处理以代替产生异常的途径
- 需要将特定的异常抛至更高层
- 终止程序
- 让类库和程序更安全