网上遍布了finally和return的执行顺序问题,也是困扰新手的问题,一堆分析,各种情况。 其实没有必要那么复杂。
finally实际上就是,java在将代码编译成字节码的时候,在所有分支的可能性路径里面都复制了一份finally块里面的代码。如果finanlly里面有return,那么 整个字节码里面,有且只会有一个return, 那就是finanlly里面的return
看下如下代码,a初始值为10,发生异常之后,exception块里面有个return a+1, 那么应该返回11。 但是finally里面还有一个return a, 因此返回了10 , 原因finally块里面的return覆盖了 exception块里面的return。 为什么会这样? 因为java在将代码编译成字节码的时候,在所有分支的可能性路径里面都复制了一份finally块里面的代码。 finanlly块的return在 exception的return之前,exception的return这个操作根本就不会执行,但是如果return之前有表达式,表达式是会执行的,比如说 return a=a+1; a=a+1是会执行的,因为这个操作和return操作完全是两个操作。
public static void main(String[] args) {
System.out.println(test());
}
public static Integer test() {
Integer a = 10;
try {
System.out.println("1 try");
int b = a / 0;