いくつかの新しいコードをレビューしています。プログラムにはtryとfinallyブロックのみがあります。 catchブロックが除外されているため、例外またはスロー可能な何かに遭遇した場合、tryブロックはどのように機能しますか? finallyブロックに直接移動するだけですか?
Tryブロック内のコードのいずれかがチェック済み例外をスローできる場合、メソッドシグネチャのthrows句に表示する必要があります。未チェックの例外がスローされると、メソッドからバブルアウトされます。
Finallyブロックは、例外がスローされるかどうかに関係なく、常に実行されます。
try
/finally
に関する小さなメモ:最終的には常に
System.exit()
が呼び出されます。try{}
ブロックは終了しません(例:無限ループ)。Java言語仕様(1) try-catch-finally
の実行方法を説明します。キャッチを持たないことは、与えられたThrowableをキャッチできるキャッチを持たないことと同等です。
- Tryブロックの実行が値Vのスローのために突然完了した場合、選択肢があります:
- Vの実行時タイプがtryステートメントのcatch句のパラメーターに割り当て可能な場合、…
…- Vの実行時タイプがtryステートメントのcatch句のパラメーターに割り当て可能でない場合、、finallyブロックが実行されます。次に、選択肢があります。
- Finallyブロックが正常に完了すると、値Vがスローされるため、tryステートメントが突然完了します。
- 最終ブロックが理由Sで突然終了した場合、tryステートメントは理由Sで突然終了します(値Vのスローは破棄され忘れられます)。
内側のブロックは、外側のブロックに例外をスローする前に実行されます。
public class TryCatchFinally {
public static void main(String[] args) throws Exception {
try{
System.out.println('A');
try{
System.out.println('B');
throw new Exception("threw exception in B");
}
finally
{
System.out.println('X');
}
//any code here in the first try block
//is unreachable if an exception occurs in the second try block
}
catch(Exception e)
{
System.out.println('Y');
}
finally
{
System.out.println('Z');
}
}
}
結果
A
B
X
Y
Z
Finallyブロックは、tryブロックが終了した後に常に実行されます。tryが正常に終了したか、例外(er、スロー可能)により異常終了したかは関係ありません。
Tryブロック内のコードのいずれかによって例外がスローされた場合、現在のメソッドは(finallyブロックの実行後に)同じ例外を単に再スロー(または引き続きスロー)します。
Finallyブロックが例外/エラー/スロー可能オブジェクトをスローし、保留中のスロー可能オブジェクトがすでにある場合は、見苦しくなります。率直に言って、私は何が起こるかを正確に忘れています(何年も前の認定の場合はそうです)。 I 思考両方のスロー可能オブジェクトがリンクされますが、「最後に」バーフされる前に元の問題を取得するために、いくつかの特別なブードゥーを実行する必要があります(つまり、検索するメソッド呼び出し)えー、投げた。
ちなみに、Javaにはデストラクタがないため、try/finallyはリソース管理のための非常に一般的なことです。
例えば。 -
r = new LeakyThing();
try { useResource( r); }
finally { r.release(); } // close, destroy, etc
「最後に」もう1つのヒント:doキャッチする場合、特定の(予想される)スロー可能サブクラスをキャッチするか、単に "Throwable"、not "例外」、一般的なキャッチオールエラートラップ。リフレクショングーフなどの問題が多すぎると、「例外」ではなく「エラー」がスローされ、次のようにコード化された「すべてをキャッチ」することで、それらは正しくスリップします。
catch ( Exception e) ... // doesn't really catch *all*, eh?
代わりにこれを行います:
catch ( Throwable t) ...
バージョン7より前のJavaバージョンでは、これらの3つの組み合わせtry-catch-finally ...を使用できます。
try - catch
try - catch - finally
try - finally
finally
または/およびtry
ブロックで何が起こっていても、catch
ブロックは常に実行されます。したがって、catch
ブロックがない場合、例外はここで処理されません。
ただし、コードのどこかに例外ハンドラが必要になります-もちろん、アプリケーションを完全にクラッシュさせたい場合を除きます。それは、アプリケーションのアーキテクチャに応じて、そのハンドラがどこにあるかによって異なります。
- Java tryブロックの後に、catchまたはfinallyブロックが必要です。
- 各tryブロックには、0個以上のcatchブロックがありますが、finallyブロックは1つだけです。
- プログラムが終了した場合(System.exit()を呼び出すか、プロセスを中止させる致命的なエラーを引き起こすことにより)、finallyブロックは実行されません。
例外またはスロー可能なものが発生した場合、tryブロックはどのように機能しますか
例外がキャッチされない他の場合と同様に、例外はブロックからスローされます。
Finallyブロックは、tryブロックの終了方法に関係なく、一致するキャッチがあるかどうかにかかわらず、キャッチがあるかどうかに関係なく実行されます。
Catchブロックとfinallyは、tryブロックの直交部分です。どちらかまたは両方を持つことができます。 Java 7を使用すると、どちらも使用できなくなります。
そのプログラムで試してみませんか? finallyブロックに移動し、finallyブロックを実行しますが、例外は処理されません。しかし、その例外はfinallyブロックで無効にすることができます!
Finallyブロックは、tryブロックが完了した後に実行されます。 finallyブロックを離れるときにtryブロック内に何かがスローされた場合、実行されます。