文章目录
1、无异常情况
情况一:都无 return 代码如下:
public static int test(){
int i = 1;
try {
++i;
System.out.println("try i = "+i);
}catch (Exception e){
++i;
System.out.println("catch i = "+i);
}finally {
++i;
System.out.println("finally i = "+i);
}
return i;
}
// 结果:
// try i = 2
// finally i = 3
// 3
此时代码按正常 try-> finally 的顺序执行。
情况二:try 中有 return
public static int test2(){
int i = 1;
try {
++i;
System.out.println("try i = "+i);
return i;
}catch (Exception e){
++i;
System.out.println("catch i = "+i);
}finally {
++i;
System.out.println("finally i = "+i);
}
return 0;
}
// 结果
// try i = 2
// finally i = 3
// 2
此时执行顺序可以看出是 try 先执行,但是执行到 return 时,在最后提交的时候没有提交,转而去执行 finally 了,执行finally 后,在最后执行为执行完的 try 中的 return。
情况三:try、finally中有return
public static int test21(){
int i = 1;
try {
++i;
System.out.println("try i = "+i);
return i;
}catch (Exception e){
++i;
System.out.println("catch i = "+i);
}finally {
++i;
System.out.println("finally i = "+i);
return i;
}
}
// 结果
// try i = 2
// finally i = 3
// 3
此时执行顺序可以看出是先执行 try ,但是没执行完 try 中的 return,转而去执行 finally 中的代码了,但是 finally 中的 return 不会执行一半去执行其他代码,而是直接执行完 return ,所以 try 中的 return 就相当于无效了。
【注意:由于没有异常,所以 catch 中的代码始终都不会执行,所以这里就不需要考虑 catch 中是否有 return了。】
2、有异常情况
情况一:都无 return
都没用return时代码如下:
public static int test13(){
int i = 1;
try {
++i;
System.out.println("try1 i = "+i);
int j = i/0;
System.out.println("try2 i = "+i);
}catch (Exception e){
++i;
System.out.println("catch i = "+i);
}finally {
++i;
System.out.println("finally i = "+i);
}
return i;
}
// 结果
// try1 i = 2
// catch i = 3
// finally i = 4
// 4
当都没有return时,程序执行顺序为 先执行 try,遇到异常后执行catch,最后执行finally,异常后的代码是不执行的。
情况二:try 中有 return
其实情况一就已经能推理处情况二的结果了,因为异常后的代码是不会执行的,所有情况二结果与情况一一致。代码如下:
public static int test3(){
int i = 1;
try {
++i;
System.out.println("try1 i = "+i);
int j = i/0;
System.out.println("try2 i = "+i);
return i;
}catch (Exception e){
++i;
System.out.println("catch i = "+i);
}finally {
++i;
System.out.println("finally i = "+i);
}
return i;
}
// 结果
// try1 i = 2
// catch i = 3
// finally i = 4
// 4
情况三:try、catch 中有 return
代码如下:
public static int test5(){
int i = 1;
try {
++i;
System.out.println("try1 i = "+i);
int j = i/0;
System.out.println("try2 i = "+i);
return i;
}catch (Exception e){
++i;
System.out.println("catch i = "+i);
return i;
}finally {
++i;
System.out.println("finally i = "+i);
}
}
// 结果
// try1 i = 2
// catch i = 3
// finally i = 4
// 3
此时我们分析一下,首先try中的return肯定是不会执行的,因为是异常后面的代码。所有就会执行catch中的return,但是又有finally,所有就会在catch的return执行到一半时转去执行finally,最后在执行完catch后面的return。
情况四:try、catch、finally 都有 return
public static int test6(){
int i = 1;
try {
++i;
System.out.println("try1 i = "+i);
int j = i/0;
System.out.println("try2 i = "+i);
return i;
}catch (Exception e){
++i;
System.out.println("catch i = "+i);
return i;
}finally {
++i;
System.out.println("finally i = "+i);
return i;
}
}
// 结果
// try1 i = 2
// catch i = 3
// finally i = 4
// 4
此时我们能看到,先执行try中代码,遇到异常转去执行catch中代码,此时catch中有return,在这个return执行到一半时会去执行finally,但是finally中也有return,finally中的return会直接一次性执行完。
总结
try、catch中若有return,都会执行到一半转向去执行finally(如果有的话),但是finally中的return不会分步执行,是一气呵成的。