Java异常机制之try catch finally return执行顺序
Backdround
实验室的大师姐突然问窝很详细的Java异常代码块的执行顺序,一下子被问蒙了,写了个测试代码,顺手放上来充数(其实不是,就是不想写托福,不学习怎么都快乐)
什么时候不执行finally
- try 或catch语句中执行了退出虚拟机的方法(即System.exit(0))
- 执行finally之前jvm崩了
- 执行finally之前电脑崩了
final执行的终极原则
没有异常finally也要跑
你懂的,不管有没有异常,final这位小火鸡都会运行
code:懒得写
return或throw前finally执行
try或catch的代码块里时遇到return或throw语句时,finally仍然会执行,反而系统并不会立即执行return或throw这两个语句,而是会去执行final,如果没有finally块,程序才会立即执行return语句或者throw语句,方法终止。如果有 finally块,系统立即开始执行finally块,只有当finally块执行完成后,系统才会再次跳回来执行try块、catch块里的 return或throw语句,如果finally块里也使用了return或throw等导致方法终止的语句,则finally块已经终止了方法,不用再跳回去执行try块、catch块里的任何代码。
当finally块里也使用了return语句,弱智代码如下:
public class Main {
public static void main(String[] args) {
System.out.println("normal operation in main function");
System.out.println(testException());
}
private static String testException(){
try {
System.out.println("normal operation in try block");
return "TRY";
}finally {
System.out.println("normal operation in final block");
return "finally";
}
}
}
运行结果:
当finally块里没有return语句:
返回值与finally的不解之谜
finally里没有return时
finally里没有return时,函数返回值是在finally执行前确定的,你猜猜下面这段代码结果是啥
public class Main {
public static void main(String[] args) {
System.out.println("normal operation in main function");
System.out.println(testException());
}
private static String testException(){
String retStr;
try {
retStr = "TRY";
System.out.println("normal operation in try block");
return retStr;
}finally {
retStr = "finally";
System.out.println("normal operation in final block");
}
}
}
运行结果可能会出乎你的意料
不要慌,程序没问题,此处涉及到一些jvm机制,详情咱有空再说,可以参考这个博客:Java进阶–Java中 i++完全解析
finally里有return时
finally里有return时,程序会提前退出,而且返回值不是try或catch中保存的返回值,而是finally里面的return语句,其实应该就是return这句其实并不是我们臆想中的简单顺序执行代码,详情可以查看对应代码的字节码