情况一:
//return 放在trycatch之外
public class TestTryCatch {
public static void main(String[] args) {
testBasic1();
}
public static int testBasic1(){
int i = 1;
try {
i++;
System.out.println("try.....i="+i);
}catch (Exception e){
i++;
System.out.println("catch....i="+i);
}finally {
i=10;
System.out.println("finally...i="+i);
}
return i;
}
}
/*
代码的执行结果:
try.....i=2
finally...i=10
*/
结论:
这段代码会按照顺序执行,先执行try内的代码段,没有异常的话进入finally,最后返回
情况二:
//将return放到try catch中
public class TestTryCatch {
public static void main(String[] args) {
//情况一
//testBasic1();
//情况二
testBasic2();
}
public static int testBasic2(){
int i = 1;
try {
i++;
System.out.println("try.....i="+i);
return i;
}catch (Exception e){
i++;
System.out.println("catch.....i="+i);
return i;
}finally {
i=10;
System.out.println("finally...i="+i);
}
}
}
/*
执行结果
try.....i=2
finally...i=10
*/
结论:
代码的执行顺序从try到catch,由于finally是无论如何都会执行的,所以try里的语句并不会直接返回. 在try语句中的return,return返回的引用变量并不是try语句外定义的引用变量i',而是系统重新定义了一个局部引用i,这个引用指向了引用i对应的值,也就是2, 即使在finally语句中吧引用i指向了10,因为return返回的引用已经不是i,而是i',所以引用的值和try的返回值无关了
情况三:
//将return放入finally中
public class TestTryCatch {
public static void main(String[] args) {
//testBasic1();
//testBasic2();
testBasic3();
}
public static int testBasic3(){
int i = 1;
try {
i++;
System.out.println("try block,i="+i);
return i;
}catch (Exception e){
i++;
System.out.println("catch block,i="+i);
return i;
}finally {
i = 10;
System.out.println("finally block,i="+i);
}
}
}
/*
输出结果
try block,i=2
finally block,i=10
*/
结论:可以看到,是从finally语句块中返回的。可见,JVM是忽略了try中的return语句。
情况四:
public class TestTryCatch {
public static void main(String[] args) {
//testBasic1();
//testBasic2();
//testBasic3();
testBasic4();
}
//在try中加入一段有异常的代码
public static int testBasic4(){
int i = 1;
try {
i++;
int m = i/0;
System.out.println("try block,i="+i);
return i;
}catch (Exception e){
i++;
System.out.println("catch block,i="+i);
return i;
}finally{
i = 10;
System.out.println("finally block,i="+i);
return i;
}
}
}
/*
执行结果:
catch block,i=3
finally block,i=10
*/
结论:因为finally中有return语句,try、catch中的异常被消化掉了,屏蔽了异常的发生
情况五:
public class TestTryCatch {
public static void main(String[] args) {
//testBasic1();
//testBasic2();
//testBasic3();
//testBasic4();
testBasic5();
}
//finally中有异常发生
public static int testBasic5(){
int i = 1;
try {
i++;
Integer.parseInt(null);
System.out.println("try block,i="+i);
return i;
}catch (Exception e){
String.valueOf(null);
System.out.println("catch block,i="+i);
return i;
}finally {
i = 10;
int m=i/0;
System.out.println("finally block,i="+i);
}
}
}
/*
Exception in thread "main" java.lang.ArithmeticException: / by zero
*/
总结:一旦finally里发生异常,try、catch里的异常信息即被消化掉了,也达不到异常信息处理的目的。
总结以上的测试:
- finally语句总会执行
- 如果try catch中有return语句,finally中没有return语句,那么在finally中修改除包装类型和静态变量.全局变量以外的数据都不会对try catch中返回的变量有影响
- 尽量不要在finally中使用return语句,如果使用的话,会忽略try catch中的返回语句,也会忽略try catch中的异常,屏蔽了错误的发生
- finally中避免再次抛出异常,一旦finally中发生异常,代码执行将会抛出finally中的异常信息,try catch中的异常将被忽略
- 在实际项目中,finally常常用来关闭流或者数据库资源的,并不额外做其他操作