问题描述
public class Test {public static void main(String[] args) {System.out.println(new Test().test());}static int test() {int x = 1;try {return x;}finally {++x;}}}
解决方案
昨天没时间,今天继续补全,既然是深入,就深入点咯 记得给我加分哈~~写了个简单的类 static int test() { int x=5; try { return x; } finally { x=10; } } 编译后的字节码为这里说一下,对于try catch finally的编译,编译器会把finally里的代码附在每一个分支的后面 static int test(); 0 iconst_5 1 istore_0 [x] //存在局部变量表0位置 2 iload_0 [x] //读取0位置到操作数栈//下边是finally代码块,附在成功分支后面 3 istore_2 //另存在2位置 4 bipush 10 //10放入操作数栈 6 istore_0 [x] //存在0位置,所以,这时候0位置的变量为10 7 iload_2 //读取2号位置,这时是5 8 ireturn //返回5//下面是异常分子处理 9 astore_1 10 bipush 10 12 istore_0 [x] 13 aload_1 14 athrow
解决方案二:
因为在运行到return时,该返回值/地址就已经被记录所以finally里的改变不会起作用但假如返回值为引用类型,finally块是可以改变其内容的如下例子~ 想想会返回什么public class Test { public static void main(String[] args) { System.out.println(new Test().test().toString()); } static StringBuffer test() { StringBuffer x = new StringBuffer("hi"); try { return x; } finally { x.append("hello"); } } }