新しいコードを確認しています。プログラムにはtryとfinallyブロックのみがあります。catchブロックが除外されているため、例外またはスロー可能な何かが発生した場合、tryブロックはどのように機能しますか?最終ブロックに直接移動しますか?
新しいコードを確認しています。プログラムにはtryとfinallyブロックのみがあります。catchブロックが除外されているため、例外またはスロー可能な何かが発生した場合、tryブロックはどのように機能しますか?最終ブロックに直接移動しますか?
回答:
tryブロックのコードのいずれかがチェック済み例外をスローできる場合は、メソッドシグネチャのthrows句に表示する必要があります。未チェックの例外がスローされると、メソッドからバブリングされます。
例外がスローされてもされなくても、finallyブロックは常に実行されます。
try
/ についての小さな注意finally
:最終的には、
System.exit()
と呼ばれます。try{}
ブロックは、(例えば無限ループ)を終了することはありません。try{..} catch{ throw ..} finally{..}
ですか?最終的には実行されないと思います
Java言語仕様(1)は、そのtry-catch-finally
実行方法を説明しています。キャッチがないことは、指定されたThrowableをキャッチできるキャッチがないことと同じです。
- 値Vがスローされたためにtryブロックの実行が突然完了した場合は、選択肢があります。
- Vのランタイムタイプがtryステートメントのいずれかのcatch句のパラメーターに割り当て可能な場合、
……- Vの実行時の型がtryステートメントのいずれのcatch句のパラメーターにも割り当てられない場合、finallyブロックが実行されます。次に選択肢があります:
- finallyブロックが正常に完了すると、値Vがスローされるため、tryステートメントが突然完了します。
- finallyブロックが理由Sで突然完了した場合、tryステートメントは理由Sで突然完了します(値Vのスローは破棄され、忘れられます)。
内側のfinallyは、外側のブロックに例外をスローする前に実行されます。
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が正常に終了したか、例外(スロー可能)により異常終了したかは関係ありません。
tryブロック内のいずれかのコードによって例外がスローされた場合、現在のメソッドは(finallyブロックの実行後に)同じ例外を再スローする(またはスローし続ける)だけです。
finallyブロックが例外/エラー/スロー可能オブジェクトをスローし、保留中のスロー可能オブジェクトがすでに存在する場合、醜くなります。率直に言って、私は何が起こるかを正確に忘れてしまいます(何年も前の私の認定にとっては)。私は両方のスロー可能オブジェクトがリンクされると思いますが、「最終的に」バーフが落ちる前に元の問題を取得するには、特別なブードゥー(つまり、私が調べなければならないメソッド呼び出し)が必要です。
ちなみに、javaにはデストラクタがないため、try / finallyはリソース管理でかなり一般的なことです。
例-
r = new LeakyThing();
try { useResource( r); }
finally { r.release(); } // close, destroy, etc
「最後に」、もう一つのヒント:あなたがあればないキャッチに置くためにわざわざ、どちらかのキャッチ特定の(予想)スロー可能オブジェクトのサブクラス、または単にキャッチ「のThrowable」、ではない一般的なキャッチすべてのエラーをトラップするための「例外」、。反射グーフなどの問題が多すぎると、「例外」ではなく「エラー」がスローされ、次のようにコード化された「catch all」で問題が発生します。
catch ( Exception e) ... // doesn't really catch *all*, eh?
代わりにこれを行ってください:
catch ( Throwable t) ...
バージョン7より前のJavaバージョンでは、try-catch-finallyのこれら3つの組み合わせが可能です...
try - catch
try - catch - finally
try - finally
finally
try
or / and catch
ブロックで何が行われているかに関係なく、ブロックは常に実行されます。したがって、catch
ブロックがない場合、例外はここでは処理されません。
ただし、アプリケーションを完全にクラッシュさせない限り、コードのどこかに例外ハンドラが必要です。これは、ハンドラーがどこにあるか、アプリケーションのアーキテクチャーに依存します。
- Javaのtryブロックの後には、catchまたはfinallyブロックが続く必要があります。
- 各tryブロックには、0個以上のcatchブロックが存在する可能性がありますが、finallyブロックは1つだけです。
- プログラムが終了した場合(System.exit()を呼び出すか、プロセスを中止させる致命的なエラーが発生した場合)、finallyブロックは実行されません。
そのプログラムで試してみませんか?finallyブロックに移動してfinallyブロックを実行しますが、例外は処理されません。しかし、その例外はfinallyブロックで却下できます!
try
ブロックの内部で、例外をスローできるコードを記述します。catch
私たちは、例外を扱うところのブロックです。finally
例外が発生したかどうかに関係なく、ブロックは常に実行されます。
ここで、try-catch-finallyブロックの代わりにtry-finallyブロックがある場合、例外は処理されず、tryブロックの代わりに、catchブロックに移動するのではなく、最終的にblockに移動します。例外を除いて何もしない場合は、try-finallyブロックを使用できます。