4

return Acatchブロックのコードはどうなりますか?

public class TryCatchFinallyTest {

    @Test
    public void test_FinallyInvocation()
    {
        String returnString = this.returnString();
        assertEquals("B", returnString);
    }

    String returnString()
    {
        try
        {
            throw new RuntimeException("");
        }
        catch (RuntimeException bogus)
        {
            System.out.println("A");
            return "A";
        }
        finally
        {
            System.out.println("B");
            return "B";
        }
    }
}
4

5 に答える 5

3

最終的にgetは、returnがメソッドを終了する直前に実行されます。したがって、あなたがするとき

return "A";

次のように実行されます。

System.out.println("B");//Finally block
return "B";//Finally block
return "A";//Return from exception catch

したがって、「A」ではなく「B」が返されます。

于 2012-10-06T14:48:13.890 に答える
3

コンパイラreturn "A";によって最適化されている可能性がありますが、そうではない可能性があり、「A」は動的に置き換えられます。実際、このコードは必要ないので、問題ではありません。

これは、制御フローにfinallyを使用する際の問題の典型的な例の1つです。一部の命令が失われ、別のコーダーが「意図」を認識しない可能性があります(実際、バグまたはいたずらのみである可能性があります)。

javacが「最終的にブロックが正常に完了しません」という警告を発行することに気付いたかもしれません。

finally節に戻らないでください

于 2012-10-06T14:53:01.993 に答える
0

finallyブロックは常に実行されますが、catchブロックは、例外がキャッチされた場合にのみ実行されます。

于 2012-10-06T14:47:58.260 に答える
0

以前return "A"は、finallyブロックが呼び出されreturn "B"return "A"スキップされて実行されることはありません。その理由は、finallyブロックは常にメソッドのステートメントの前に実行され、ブロックreturnから何かを返す場合、のステートメントは常にスキップされます。finallyreturntry/catch

注:finallyブロックから戻ることは、Javaプログラマーにとって良い習慣ではありません。また、JAVAコンパイラは、ブロックから何かを返す場合、「 finallyブロックは正常に完了しませんfinally」という警告を表示します。

于 2012-10-06T14:52:38.493 に答える
0

ついに

finally節をtry-catchブロックにアタッチできます。tryまたはcatchブロック内から例外がスローされた場合でも、finally句内のコードは常に実行されます。コードのtryまたはcatchブロック内にreturnステートメントがある場合、finallyブロック内のコードは、メソッドから戻る前に実行されます。

参考資料http://tutorials.jenkov.com/java-exception-handling/basic-try-catch-finally.html

于 2012-10-06T14:54:58.057 に答える