9
  public class FinallyTest {
    static int i=0;
    public static void main(String a[]){
        while(true){
            try{
                i=i+1;
                return;
            }finally{
                i=i+1;
                break;
            }
        }
        System.out.println(i);
    }
}

上記のコードでは、出力は「2」です。私が期待していたのは、何も印刷されるべきではないということでした。ここで「休憩」は正確に何をしますか?説明してください。ありがとう

4

4 に答える 4

11

このfinally句は、try 句の「完了理由」を変更します。詳細な説明については、 JLS 14.14.1 Normal and Abrupt Completion of Statementsを参照して、 JLS 14.20.2 - Execution of try-catch-finallyを参照してください。

これは、Java 言語の奇妙なエッジ ケースの 1 つです。節の制御フローを意図的に変更しないことをお勧めfinallyします。これは、読者が動作を理解するのが難しいためです。

別の病理学的例を次に示します。

// DON'T DO THIS AT HOME kids
public int tricky() {
    try {
        return 1;
    } finally {
        return 2;
    }
}
于 2011-07-02T09:38:22.707 に答える
5

finally 句のコードは実行するようにバインドされています。

フローは次のとおりです。

したがって、try ブロックでitoの値をインクリメントした後1、return ステートメントに遭遇します。しかし、それもついにブロックしました。したがって、finally ブロックを実行し、それらを再度実行して、 to の値をインクリメントしiます2。その後、ブレークインが発生し、ループが終了します。

だから、i = 2最後の値。流れが明確であることを願っています。

于 2011-07-02T09:38:25.983 に答える
4

ループを中断し、リターンを「オーバーライド」します。

  1. finallyブロックは常に実行されます
  2. で発生することは、以前に発生したfinallyことをオーバーライドできます-スローされた例外、ステートメントを返します。
于 2011-07-02T09:37:19.060 に答える
0
public static void main(String a[])
{
    while(true) <<< #1
    {
        try
        {
            i=i+1;  <<< #2
            return;
        }
        finally
        {
            i=i+1;  <<< #3
            break;  <<< #4
        }
    }
    System.out.println(i);  <<< #5
}

これが BlueJ Tracing が示すものです。

于 2011-07-02T09:42:27.567 に答える