2017-07-26 22 views
1

は簡単なのtry-catch-最終的方法を考える:地元の人たち= 3は、しかし、唯一の2つの項目があるLocalVariableTableには何がありませんか?

public void t(); 
    descriptor:()V 
    flags: ACC_PUBLIC 
    Code: 
stack=1, locals=3, args_size=1 
    0: aload_0 
    1: invokespecial #15     // Method f1:()V 
    4: goto   26 
    7: astore_1 
    8: aload_0 
    9: invokespecial #18     // Method f2:()V 
    12: aload_0 
    13: invokespecial #21     // Method f3:()V 
    16: goto   30 
    19: astore_2 
    20: aload_0 
    21: invokespecial #21     // Method f3:()V 
    24: aload_2 
    25: athrow 
    26: aload_0 
    27: invokespecial #21     // Method f3:()V 
    30: return 
Exception table: 
    from to target type 
     0  4  7 Class java/lang/Exception 
     0 12 19 any 
LineNumberTable: 
    line 7: 0 
    line 8: 4 
    line 9: 8 
    line 11: 12 
    line 10: 19 
    line 11: 20 
    line 12: 24 
    line 11: 26 
    line 13: 30 
LocalVariableTable: 
    Start Length Slot Name Signature 
     0  31  0 this Lsample/Sample; 
     8  4  1  e Ljava/lang/Exception; 
StackMapTable: number_of_entries = 4 
    frame_type = 71 /* same_locals_1_stack_item */ 
    stack = [ class java/lang/Exception ] 
    frame_type = 75 /* same_locals_1_stack_item */ 
    stack = [ class java/lang/Throwable ] 
    frame_type = 6 /* same */ 
    frame_type = 3 /* same */ 

お知らせ: "のjavac -g" で

public void t() { 
    try { 
     f1(); 
    }catch(Exception e) { 
     f2(); 
    }finally { 
     f3(); 
    } 
} 

を、それがにコンパイルされますLocalVariableTable。バイトコード行19(astore_2)と24(aload_2)は、3番目のローカル変数が存在することを示します。

問題は、第3のローカル変数は何ですか、なぜそれがLocalVariableTableで欠落しているのですか?

答えて

1

第3のローカル変数は、finallyブロックの実装の詳細です。 try/catchが変数をスローする場合は、例外を一時的に格納して、再スローする前にf3()を呼び出す必要があります。これがスロット2の処理です。

+0

興味深いデザイン。 'f3()'が呼び出される前に変数が単にオペランドスタックに残っていれば、それはうまくいくのでしょうか? (最大スタック深度が増える可能性があります) – dejvuth

+0

この場合、3番目のローカル変数はThrowable型であるべきですか?しかし、なぜそれがLocalVariableTableに現れないのですか? – ziyi

+0

この場合、オペランドスタックに残っていた可能性がありますが、Javacのcodegenはさまざまな理由で可能な限り避けようとします。なぜ表に表示されないのかを推測しなければならないのは、ソースレベル変数に対応していないからです。 LocalVariableTableはデバッグ用です。 – Antimony

関連する問題