私の知る限り、次のコードスニペットはどちらも同じ目的を果たします。なぜfinally
ブロックがあるのですか?
コードA:
try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }
コードB:
try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code
Throwable
...をキャッチしていないことを願っています)finally
ブロックはただしがそのブロックを終了することを確実にし(プロセス全体を明示的に中止するいくつかの方法を法として)、それは実行されます。これは、リソースの確定的なクリーンアップにとって重要です。
(Java少なくとも、おそらくC#でも)try
なしでcatch
ブロックを持つことも可能ですが、finally
。try
ブロックで例外が発生すると、finally
ブロックのコードが実行されてから、例外がスローされます。
InputStream in = new FileInputStream("somefile.xyz");
try {
somethingThatMightThrowAnException();
}
finally {
// cleanup here
in.close();
}
Tryブロックまたはcatchブロックで何が発生したかに関係なく、実行したいコードを実行したい場合があります。
また、複数のcatchを使用していて、すべてのcatchブロックに共通のコードを配置したい場合、これは配置する場所ですが、tryのコード全体が実行されたかどうかはわかりません。
例えば:
conn c1 = new connection();
try {
c1.dosomething();
} catch (ExceptionA exa) {
handleexA();
//c1.close();
} catch (ExceptionB exb) {
handleexB();
//c1.close();
} finally {
c1.close();
}
最後に常に実行されますが、catch後のコードでは実行されない場合があります。
アプリケーションが強制的に閉じられても、これらのコード行をfinally
ブロックに記述して実行すると、実行する必要があるいくつかのタスク(メモリの解放、データベースの終了、ロックの解放など)が実行されます例外がスローされるかどうか...
アプリケーションはスレッドのコレクションである場合があります。Exception
はスレッド全体を終了しますが、アプリケーション全体を終了するわけではありません。この場合、finally
の方が便利です。
JVMの失敗、スレッドの終了など、finally
が実行されない場合があります。
スローされる可能性のある例外に関係なく、そのコードを実行する必要があるからです。たとえば、一部のアンマネージリソースをクリーンアップする必要がある場合があります( 'using'構成はtry/finallyブロックにコンパイルされます)。
最後にJavaでブロックして、ファイルのクローズ、接続のクローズなどの「クリーンアップ」コードを配置するために使用できます。
プログラムが終了した場合(System.exit()を呼び出すか、プロセスを中止させる致命的なエラーが発生した場合)、finallyブロックは実行されません。
Catchブロックが例外をスローした場合、残りのコードは実行されないため、finallyブロックを作成する必要があります。
まだ下にスクロールしますか?どうぞ!
この質問はしばらく前に私に苦労しました。
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
console.writeline(ex.Message);
}
finally
{
console.writeline("Finally block");
}
console.writeline("After finally");
上記のシナリオでは何が印刷されますか?はい、それは正しいと推測しました:
ex.Message-それが何であれ(おそらくゼロで除算しようとした)
最後にブロック
ついに
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
throw(ex);
}
finally
{
console.writeline("Finally block");
}
console.writeline("After finally");
これは何を印刷しますか?何もない! catchブロックでエラーが発生したため、エラーがスローされます。
優れたプログラミング構造では、このコードは別のレイヤーから処理されるという意味で、例外が集中します。そのような場合を刺激するには、このコードを試してみます。
try
{
try
{
int a=1;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
throw(ex);
}
finally
{
console.writeline("Finally block")
}
console.writeline("After finally");
}
catch(Exception ex)
{
console.writeline(ex.Message);
}
この場合、出力は次のようになります。
例外をキャッチして他のレイヤー(Funneling)に再度スローすると、スロー後のコードが実行されないことは明らかです。これは、関数内のreturnが機能する方法と同様に機能します。
Catchブロックの後にコードのリソースを閉じない理由がわかったので、finallyブロックに配置します。
finally
は常に実行されますが、JVMがシャットダウンされていない限り、finally
はクリーンアップコードを1か所に配置する方法を提供するだけです。
catch
ブロックのそれぞれにクリーンアップコードを配置しなければならない場合、面倒です。
何があってもコードを実行したい場合があります。例外がスローされるかどうか。次に、finally
を使用します。