finallyに対する理解が徹底しているかどうかを確認するコード

4064 ワード

ちょうどcsdnでfinallyの問題について討論する招待状を見ました。http://bbs.csdn.net/topics/390439078
プログラムコード:
package test;

public class Test {
    
    public int inc() {
        int x;
        try {
            x = 1;
            return x;
        } catch (Exception e) {
            x = 2;
            return x;
        } finally {
            x = 3;
        }
    }
    
    public StringBuffer inc(StringBuffer x) {
        try {
            x.append("1");
            x = new StringBuffer();
            return x;
        } catch (Exception e) {
            x.append("2");
            return x;
        } finally {
            x.append("3");
            x = new StringBuffer("4");
        }
    }
    
    public static void main(String[] args) {
        int x = new Test().inc();
        System.out.println(x);
        StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1);
        System.out.println(x1);
        System.out.println(x2);
    }
}
最初に見た時は簡単だったと思いますが、プログラムを実行してみたら自分の思っていたものとは違っています。詳しく分析してみました。
実行結果:
113
分析結果:
1、int x = new Test().inc();
inc() , int x, try x 1, return x! finally x , inc() ! 1
:x , return , x , !
finally return, 3.

2、StringBuffer x1 = new StringBuffer(), x2 = new Test().inc(x1);
  inc(x1)  , try    x1.append("1"); 
x1 = new StringBuffer(); x1 :x1 = xx2 = new StringBuffer()
return xx2;
finally xx2.append("3");xx2 = xxx3 = new StringBuffer("4");

new Test().inc(x1) xx2, xx2.append("3")
x1 , x1.append("1");

, , !

:1,1,3