异常是什么?
异常就是程序正常执行时出现的阻止程序继续执行的情况。
java异常体系
在java中Threable是所有异常类的根,所有的异常类都直接或者间接的继承自Threable。可以通过继承Exception或者Exception的子类来创建自己的异常类。
这些异常类主要分为:系统错误、和异常。
1、Error(错误): 这类错误是有java虚拟机抛出的,描述的时内部系统错误,一旦发生,只能尽量稳妥的终止程序。这是程序无法处理的错误。
2、Exception(异常): 描述的是由程序和外部环境所引起的错误,可以被程序捕获和处理。
RuntimeException(运行时异常): 继承自Exception。
常见的RuntimeException 有:
ArithmeticException:一个数除以0。
NullPointerExceptio:试图通过一个奴看看引用变量访问一个对象。
IndexOutBoundsException:数组下表超出范围。
IllegalArguementException:传递给方法的参数非法或不合适。
java语言又将派生于Error类或RuntimeException类的所有异常成为非受查异常,其他为受查异常。
图中蓝色部分为受查异常,红色为非受查异常
注意: 所有的受查异常必须用try-catch块处理。如果一个方法可能抛出受查类型的异常,则方法声明中必须用throws显示说明;多个异常类型用逗号分隔。
异常处理
抛出异常:throw
throw new ArithmeticException();
捕获异常:catch
try{
//可能抛异常的代码
}catch(异常类型 异常对象){
}finally{
//异常的出口 无论什么情况都得执行finally,
//不论try块中是否出现异常或者是否被捕获。
}
注意:(1)不能只有try,try后面必须跟一个catch或者finally.
(2)执行try中没有出现异常,则跳过catch子句。
(3)一旦try中语句出现异常,try代码块中的程序就不会继续执行,而是交给catch代码块来执行。
(4)查找处理对应异常的代码(异常处理器),这个查找过程为捕获一个异常。从当前方法开始,沿着方法调用链,从第一个到最后一个逐个检查catch块,判断异常是否匹配,若匹配,就将该异常对象赋值给所声明的变量,然后执行catch块的代码。如果没有找到异常处理器,java会退出这个方法,把异常传递给调用这个方法的方法,继续查找,如果在调用方法链中始终找不到异常处理器,程序就会终止并且在控制台上打印出错信息。
下面我们用一个例子来理解上述第四点:
假设在main方法中method1,method1调用method1,method2调用method3,method3抛出异常。
解释:(1)如果异常类型是Exception3,他就会被method2中处理异常e3的catch块捕获。跳过statement5,然后执行statement6。
(2)若异常类型是Exception2,则退出method2,控制被返回给method1,y异常就会被method2中处理对应异常的catch块捕获,跳过statement3,执行statement4。
(3)若异常类型是Exception1,则退出method1,控制被返回给main,异常就会被main中处理对应异常的catch块捕获,跳过statement1,执行statement2。
(4)若异常没有被以上方法所捕获,程序就会终止,不执行statement1和statement2。
声明异常:throws
受查异常必须在方法声明时显示声明。
从异常中获取信息
异常对象中包含关于异常的有价值的信息,通常通过以下方法从异常中获取信息。
toString()
getMessage()
getStackTrance()
以上些内容参考Java语言程序设计【梁勇】第10版