Java异常处理流程
java中处理异常的代码块构成一般如下
class TestException{
String testEx(){
try {
System.out.println("捕获异常");
}catch (java.lang.Exception E){
System.out.println("处理发生异常");
}finally {
System.out.println("无论异常是否发生必定执行");
}
return "异常区结束";
}
}
代码中的finally代码块主要用于关闭必须要关闭的资源。比如在处理I/O的时候,一但发生异常。如果I/O流无法被关闭就会长时间占用系统资源。
异常处理的基本流程是,程序的控制权从发生异常的地方转移到处理异常的地方,而finally代码块无论是否发生异常都必须执行,那么就会出现一个问题,catch代码块中出现了return语句,finally语句是否还会执行?fianlly语句块中有return代码的执行流程又是什么样?
问题1:返回语句在catch中,finally中没有返回语句的执行流程分析
修改上述代码,如下:
class TestException{
String testEx(){
try {
int i= 4/0; //模拟异常发生
System.out.println("捕获异常");
}catch (java.lang.Exception E){
System.out.println("处理发生异常");
return "catch";
}finally {
System.out.println("无论异常是否发生必定执行");
}
return "异常区结束";
}
}
执行方法后的测试结果:
可以看到,在catch语句块中加了return语句后,finally语句块依旧会执行。并且在执行完毕finally语句块后,在从catch语句块中进行函数值的返回。
问题2:返回语句在catch中,finally中有返回语句的执行流程分析
修改上述代码如下:
class TestException{
String testEx(){
try {
int i= 4/0; //模拟异常发生
System.out.println("捕获异常");
}catch (java.lang.Exception E){
System.out.println("处理发生异常");
return "catch";
}finally {
System.out.println("无论异常是否发生必定执行");
return "finally";
}
}
}
测试执行结果:
从测试结果得出,此时的异常流程处理,是先在catch中处理异常,遇到return语句后,程序控制权跳转到finally语句代码块中,如果finally代码块中有return语句,则程序直接return到函数调用位置。
问题23:catch中,finally中都没有返回语句的执行流程分析
修改上述代码如下:
class TestException{
String testEx(){
try {
int i= 4/0; //模拟异常发生
System.out.println("捕获异常");
}catch (java.lang.Exception E){
System.out.println("处理发生异常");
}finally {
System.out.println("无论异常是否发生必定执行");
}
return "代码结束";
}
}
程序运行结果分析:
如果异常处理中没有函数返回语句,那么会直接执行异常处理块外面的代码。