查了很多资料,大家对于java中异常捕获机制的return说法很多,下面总结自己一些遇到的情况
1.finally中没有return如下
public class Test{
public static void main(String [] args){
int a = 0;
System.out.println(test(a));
}
public static int test(int a){
try {
// a = a/0;
return a++;
}catch (Exception e) {
return a++;
}finally{
System.out.println("执行了finally");
}
}
}
结果:执行了finally
0
分析:执行到静态方法test时,执行try中语句时,虚拟机会对return语句后面值分配内存空间,没有遇到异常,catch块中语句不会执行,try块中语句先执行return后面的a++,将a++的值装载到内存空间,然后执行finally块中的语句,最后执行return,返回内存空间中的值0;当try块中出现异常,例如在return a++前加上a = a/0,try块中的return语句不会执行,接着执行catch中的语句,同上所述,先执行catch块中return后面的语句,然后执行finally块中语句,最后return跳出异常捕获机制,返回值0。
2.finally中有return,代码如下
public class Test{
public static void main(String [] args){
int a = 0;
System.out.println(test(a));
}
public static int test(int a){
try {
// a = a/0;
return a+1;
}catch (Exception e) {
return a+1;
}finally{
System.out.println("执行了finally");
return a+2;
}
}
}
结果:执行了finally2
分析:同理,虚拟机会对return后面语句分配内存空间,用来装载缓存return后面结果值,当程序执行到try块中的return语句时,会先将值1保存早内存空间,然后执行finally块中语句,在执行到return语句时,将原内存空间中的值1替换为值2,try中return不会执行,finally中return直接跳出异常捕获机制把值传送给调用者。try中有异常时同上分析。
注:finally中出现return语句在实际开发中是没有意义的,它的出现会使try和catch中的return失去作用,因此java编译器在编译时也会提示警告!