一、Java异常处理机制概述
1、Java虚拟机用方法调用栈来跟踪每个线程中一系列的方法调用过程。
2、方法中的代码块可能抛出异常,有如下两种处理办法:
(1)在当前方法中通过try…catch语句捕获并处理异常。
(2)在方法的声明处通过throws语句声明抛出异常
3、当Java虚拟机追溯到调用栈的底部的方法时,如果仍然没有找到处理该异常的代码块,将按以下步骤处理:
(1)调用异常对象的printStackTrace()方法,打印来自方法调用栈的异常信息。
(2)如果该线程不是主线程,那么终止这个线程,其他线程继续正常运行。如果该线程是主线程(即方法调用栈的底
部为main()方法),那么整个应用程序被终止。
二、运用Java异常处理机制
1、在Java语言中,用try…catch语句来捕获异常,
格式如下: try{
//可能会出现异常的代码
}
catch(SQLException e){
//处理操纵数据库出现的异常
}
catch(IOException e){
//处理操纵输入流和输出流出现的异常
}
2、finally语句中的代码是在异常处理的任何情况下都必须执行的代码。finally代码块能保证特定的操作总是会被执行,
它的形式如下: try{
//可能会出现异常的代码
}
catch(Exception e){
//处理异常
}
finally{
//特定的操作
}
3、不管try代码块中是否出现异常,都会执行finally代码块。
4、如果一个可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常。一个方法可能会出
现多种异常,throws子句允许声明抛出多个异常,例如:
public void method()throws SQLException,IOException{…}
5、throw语句用于抛出异常,由throw语句抛出的对象必须是java.lang.Throwable类或者其子类的实例。
三、异常处理语句的语法规则:
(1)try代码块不能脱离catch代码块或finally代码块而单独存在。try代码块后面至少有一个catch代码块或finally代码块。
(2)try代码块后面可以有零个或多个catch代码块,还可以有零个或至多一个finally代码块。如果catch代码块和finally代
码块并在,finally代码块必须在catch代码块后面。
(3)try代码块后面可以只跟finally代码块。
(4)在try代码块中定义的变量的作用域为try代码块,在catch代码块和finally代码块中不能访问该变量。
(5)当try代码块后面有多个catch代码块时,Java虚拟机会把实际抛出的异常对象依次和各个catch代码块声明的异常类型匹配,
如果异常对象为某个异常类型或其子类的实例,就执行这个catch代码块,而不会再执行其他的catch代码块。
(6)如果一个检查异常,要么用try…catch语句捕获,要么用throws语句声明将它抛出,否则会导致编译错误。
(7)throws语句后面不允许紧跟其他语句,因为这些语句永远不会被执行。
四、异常流程的运行过程:
(1)finally语句不会被执行的惟一情况是先执行了用于终止程序的System.exit()方法。
exit()方法的定义如下:public static void exit(int status)
exit()方法的参数status表示程序终止时的状态码,按照编程惯例,0表示正常终止,非零数字表示异常终止。
(2)return语句用于退出本方法。在执行try或catch代码块中的return语句时,假如有finally代码块,会先执行finally代码块。
(3)finally代码块虽然在return语句之前被执行,但finally代码块不能通过重新给变量赋值的方式来改变return语句的返回值。
(4)建议不要在finally代码块中使用return语句,因为它会导致两种潜在的错误。第一种错误是覆盖try或catch代码块的return语句,
第二种错误是丢失异常。
五、Java异常类
1、所有异常类的祖先类为java.lang.Throwable类,它的实例表示具体的异常对象,可以通过throw语句抛出,Throwable类提供
了访问异常信息的一些方法,常用的方法包括:
(1)getMessage()——返回String类型的异常信息。
(2)printStackTrace()——打印跟踪方法调用栈而获得的详细异常信息。在程序调试阶段,此方法可用于跟踪错误 。
2、常见的运行时异常包括:NullPointerException、ClassCastException、ArithmeticException、
IllegalArgumentException和IndexOutOfBoundsException,这种异常的特点是Java编译器不会检查它,
也就是说,当程序中可能出现这类异常时,即使没有用try…catch语句捕获它,也没有用throws子句声明它,还是会通过编译。