4

次のコードに適用される規則:

    try {
        assert (false) : "jane";
    } catch (Exception e2) {
        System.out.print("ae2 ");
    } finally {
        throw new IllegalArgumentException();
    }

Assetion が有効になっています。

AssertionError の代わりに IllegalArgumentException が報告されるのはなぜですか? この状況に適用されるルールはありますか?

編集: ごめんなさい!この例では、アサート ( false )が必要です。

4

4 に答える 4

6

finallyブロックは常に実行されます。はasserttrue と評価されるため、finallyブロックは例外をスローします。

また、アサーションはデフォルトで無効になっています。これが、アサーションが評価されなかった理由である可能性があります。

ps

assertが false と評価された場合、finallyはとにかく実行され、代わりにAssertionError.

finallyJVM がブロック内で停止する場合を除いて、ブロックは常に実行されることを忘れないでくださいtry

于 2011-11-23T17:53:07.813 に答える
1

finallyブロック (またはブロック) 内で例外がキャッチされない場合、そのブロックcatchからの例外はすべてtry破棄されます。詳細については、Java 言語仕様 § 14.20を参照してください。Java 7 の時点で、囲んでいる try/catch ブロックは、破棄された例外を回復できます (ここで説明されているように)。

于 2011-11-23T18:02:55.083 に答える
0

finallyブロックは常に実行されます。実行されない唯一の状況は、JVM のシャットダウン (つまりSystem.exit(-).) です。

あなたが興味深いと思うかもしれないのは、あなたが持っていたとしてもそれです:

try { 
    return ...; 
} 
finally { 
    ...
}

finally ブロックは引き続き実行され、メソッドが終了する前に実行されます。

于 2011-11-23T18:10:53.293 に答える
0

何でもする唯一の行は

throw new IllegalArgumentException();

一方

assert true

何もしないし、したとしても捕まらないcatch(Exception

于 2011-11-23T17:54:21.677 に答える