1

私はtry... catch...例外を再スローするfinallyブロックを持っています:catch

try
{
    startBombCountdownAndRunAsFastAsYouCan();
}
catch (BombExplodedOnYourFaceException ex)
{
    displayMessage("Hahaha! It blew up on your face!");
    throw ex;
}
finally
{
    cleanFloor();
}

displayMessage("Wow, you pulled it off!");

この例ではcleanFloor()、例外がスローされたかどうかに関係なく実行する必要があります。問題は、対応する句で例外が再スローされるかどうかに関係なく、finallyは常に実行されるかということです。catch

4

3 に答える 3

5

はい、これこそが、最終的なコンセプトが作成された正確な目的です。

于 2011-03-11T18:05:09.323 に答える
2

通常はfinally実行されますが、常に実行されるとは限りませ

finallyブロックが実行されない次のJavaプログラムについて考えてみます。

package test;
public class TestFinally {
    public static void main(String[] args) {
        try {
            throw new Exception ("throw!");
        }
        catch(Exception ex) {
            System.out.println("catch!");
            System.exit(0);
        }
        finally {
            System.out.println("finally!");
        }       
    }
}

以下を出力します。

catch!

制御がに戻された場合にのみ、finally catchが実行されcatchます。これは、ご覧のとおり、保証されることはありません。を実行するかどうかの決定finallyは、基本的に停止性問題に還元されます。

実際には、finallyブロックは通常実行されます。常にではありません。


PeterNorvigのJavaIAQ:まれにしか回答されない質問には、これについて少し説明があります。

Q:finally句のコードは、実行に失敗することはありませんよね?

まあ、ほとんどありません。ただし、ブール値の選択の値に関係なく、finallyコードが実行されない例を次に示します。

try {
    if (choice) {
        while (true) ;
    } else {
        System.exit(1);
    }
} finally {
    code.to.cleanup();
}
于 2011-03-11T18:41:46.707 に答える
2

はい、finally ブロックは常に実行されます。

また、明示的にキャッチされた例外を使用しない場合の補足として、「catch { ... throw; }.

参考のため:

http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx

于 2011-03-11T18:12:23.683 に答える