Java的异常处理机制可以让程序具有极好的容错性,让程序更加健壮。当程序运行出现意外情形时,系统会自动生成一个 Exception 对象来通知程序,从而实现将“业务功能实现代码”和“错误处理代码”分离,提供更好的可读性
使用异常的作用:
(1)、解决问题并再次调用造成异常的方法。
(2)、平息事态的发展,并在不重新尝试方法的前提下继续。
(3)、计算另一些结果,而不是希望方法产生的结果。
(4)、在当前环境中尽可能解决问题,以及将相同的异常重新抛出到一个更加高级的环境。
(5)、在当前环境中尽可能解决问题,以及将不同的异常重新抛出到一个更加高级的环境。
(6)、终止程序执行。
(7)、简化编码。若异常方案使事情变得更加复杂,那就会令人非常烦恼,不如不用。
(8)、使自己的库和程序变得更加安全。这既是一种“短期投资”(便于调试),也是一项“长期投资”(改善应用程序的健壮性)。
一、Java异常的分类
Java异常类最顶层的基类是Throwable,它有两个子类,分别是Error和Exception,前者表示程序无法处理的错误(error),后者就是我们所说的异常。错误(error)是指那些程序之外的条件状态使得程序无法恢复的不正常事件,比如假设一个应用能够打开一个文件,但是由于硬件或者系统故障导致程序不能读取这个文件中的内容。这个失败的“读操作”将会出现一个“java.io.IOError”异常,错误(error)是不能被捕捉或者抛出的,它本身就是一种错误(废话)。而异常又分为两种,分别是非运行时异常和运行时异常(RuntimeException)。非运行时异常表示RuntimeException之外的异常(废话),在程序中必须进行异常处理(捕获异常或者抛出)。如果不处理,程序就不能编译通过。对于运行时异常,通俗的解释是程序在执行的时候才发现的异常,这编译的时候往往无法发现这类异常,它们一般是由程序逻辑错误引起的,Java编译器不强制要求我们一定要处理这类异常,但是我们应该从逻辑的角度上尽量避免这类异常的发生。NullPointerException和IndexOutOfBoundsException都是运行时异常。为什么编译器不强制我们进行异常处理呢?因为我们的程序运行起来的时候可能出现各种异常,比如空指针异常、数组越界异常,它们是不确定的,是我们“意料之外”出现的,在程序中指定这些非确定的异常是不合理的
二、使用try…catch
Java异常处理机制为:抛出异常,捕捉异常,处理异常
try {
//业务功能代码
} catch(异常类1 e1) {
//异常处理代码1
} catch(异常类2 e2) {
//异常处理代码1
}
... catch(异常类n en) {
//异常处理代码n
}
在使用try…catch捕获处理异常时需要注意:
(1)不要过度使用异常,不能使用异常处理机制来代替正常的流程控制语句
(2)异常捕获时,一定要先捕获小异常,再捕获大异常。否则小异常将无法被捕获
(3)避免出现庞大的try块
(4)避免使用catch(Exception e){}
(5)不要忽略异常
Exception类的常用方法
三、Java异常体系(错误和异常)
Java把所有的非正常情况分成两种:异常(Exception)和错误(Error),它们都继承Throwable父类
1、Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。 程序中应当尽可能去处理这些异常
2、Error错误,一般是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败 等,这种错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理 这些错误,因此应用程序不应该试图使用catch块来捕获Error对象。在定义该方法 时,也无须在其throws子句中声明该方法可能抛出Error及其任何子类