我们知道,finally块作为java异常处理机制的一部分,其中的代码无条件执行,通常执行释放资源等操作。
但是想本小白这样的初学者可能会有这样的疑惑:有返回值的方法执行到return就会结束,return与finally块之间的执行发生冲突时会发生什么呢?为了解决这种疑惑,本小白做了一下尝试:
- 1在try块中有return,在finally中没有return,程序执行没有异常:
程序执行结果为public class ExceptionDemo { public static String test(String str){ try { return str; } catch(Exception e){ } finally{ str = "456"; System.out.println("finally"); } return null; } public static void main(String[] args) { System.out.println(test("123")); } }
finally- 123
这个结果说明,程序执行到return str,并没有直接返回,而是强行执行finally块,但是这是返回值str已经确定,finally中即使尝试修改也无济于事,但是“finally”依然会执行。
注意这时在finally块之外必须有return语句以保证方法一定会有返回值,否则会报编译错误。
- 2在try块中有return,在finally中也有return,程序执行没有异常:
public class ExceptionDemo { public static String test(String str){ try { return str; } catch(Exception e){ } finally{ str = "456"; System.out.println("finally"); return str; } } public static void main(String[] args) { System.out.println(test("123")); } }
- 程序执行结果为
finally - 456
这个结果说明,当finally块中包含return,程序就会无视try中的return语句,此时编译器会报异常(finally block does not complete normally)提醒我们try中的return语句将不会执行。
注意这是finally块以外就不能再有任何代码,否则会报(Unreachable code)- 程序执行结果为