标签:try catch finally re java异常执行过程
结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。编译器把finally中的return实现为一个warning。
但是需要注意的是,经过测试表明:在try 或者catch中的return语句,如果return的是int、long、double常量类型以及String、Integer等的封装类型,那么在finally中对return变量的值的修改不会影响在try 或者catch中的return语句的返回结果。
而恰好相反的是:在在try 或者catch中的return语句,如果return的是List等等对象类型的值,那么在finally中对其值的修改会影响try 或者catch中的return语句的返回结果。
当然, 如果在finally中执行return语句,finally对返回值的修改都会影响返回值。
举例说明1:
public static int tryCatchFinallyReturn(){
int a = 1;
int b = 100;
try{
a = 2;
return a+b-2;
}catch(Exception e){
e.printStackTrace();
}
finally{
System.out.println("finally");
a = 4;
System.out.println(a);
System.out.println("finally2");
}
return a+b;
} main方法:
int c = tryCatchFinallyReturn();
System.out.print(c);finally 4 finally2 100说明虽然a的值改为了4,但try中的返回值并没有被修改。
举例说明2:
public static List tryTest(){
List<Integer> list = new ArrayList<Integer>();
int a = 2;
try{
list.add(new Integer(a));
for(Integer ii :list){
System.out.println(ii.intValue()+"----");
}
return list;
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("finally");
a = 4;
System.out.println(a);
list.add(new Integer(a));
System.out.println("finally2");
for(Integer ii :list){
System.out.println(ii.intValue()+"----");
}
}
return list;
}main方法:
List<Integer> a = tryTest();
for(Integer b:a){
System.out.println(b.intValue()+"----main");
}2---- finally 4 finally2 2---- 4---- 2----main 4----main说明影响了对象类型的返回结果。
举例说明3:
public static String trytestString(){
String a = "aaa";
String b = "bbb";
try{
a = "aaa2";
return a+b;
}catch(Exception e){
e.printStackTrace();
}
finally{
System.out.println("finally");
a = "aaa3";
System.out.println(a);
System.out.println("finally2");
}
return a+b;
}main方法: System.out.println(trytestString());
finally aaa3 finally2 aaa2bbb跟返回常量结果一样。
版权声明:本文为博主原创文章,转载请注明出处:http://blog.csdn.net/lingzhm
标签:try catch finally re java异常执行过程
原文地址:http://blog.csdn.net/lingzhm/article/details/47782937