Finallyステートメントの使用法を正しく理解できませんでした。違いは何ですか?
try {
a;
block;
off;
statements;
} catch (Exception e) {
handle;
exception;
e;
} finally {
do;
some;
cleanup;
}
一方で、そして:
try {
a;
block;
off;
statements;
} catch (Exception e) {
handle;
exception;
e;
}
do;
some;
cleanup;
もう一方の
それらは異なる場合
try
ブロックは、_Java.lang.Throwable
_ではない_Java.lang.Exception
_をスローすることで完了します。たとえば、AssertionError
やOutOfMemoryError
などの_Java.lang.Error
_であるためです。continue
、break
、return
などの制御フローステートメントを使用して、tryブロックが突然完了するより一般的には、Java言語は、tryステートメントが完了する前にfinallyブロックが実行されることを保証します(tryステートメントが完了しない場合、finallyは保証されません。Aステートメントは、ハードウェアシャットダウン、OSシャットダウン、VMシャットダウン(たとえば、_System.exit
_による)、スレッド待機中(Thread.suspend()
、synchronized
、Object.wait()
、Thread.sleep()
)またはその他のビジー状態(無限ループ、、、、)。
したがって、finally
ブロックは、メソッド本体の終わりよりもクリーンアップアクションのより良い場所ですが、それ自体では、クリーンアップの実行を保証できません。
finally
ブロックは常に実行されます。
finally
ブロックは、try
/catch
内で使用されたリソースを解放したり、db接続を閉じたり、ソケットを閉じたりするなど、クリーンアップに使用されます。 try
/catch
ブロック。
finally
ブロックが実行されないのは、try
/catch
でsystem.exit()
が呼び出されたとき、または例外の代わりにエラーが発生したときだけです。
上記の説明のエラーは、Javaアプリケーションがメモリ不足エラーなどの条件で終了する場合を意味します。このため、いくつかの反対票が表示されます:(.
主な違いは、catch
セクション自体が例外をスローしたり、周囲のブロックから抜け出したり、現在のメソッドから戻ったりする可能性があることです。その場合do; some; cleanup;
は実行されません。
finally
ブロックでは、そのコードが実行されるのは保証です。
すべての例外をキャッチすることは基本的に悪い考えです。そのため、キャッチされなかった例外がtry/catchまたはtry/catch/finallyブロックの外に伝播した場合にどうなるかを考慮する必要があります。最後に、ブロックを使用すると、途中で片付けることができます。
また:
簡単に言うと、try/catchブロックを離れるときにコードを実行したい場合ただしあなたは(プロセスが非常に強く終了することを除いて)それを離れることになり、最終的にあなたの友人になります。
適切なコーディングスタイルでは、以下のようにすべてをキャッチする必要はありません。
try{
[some task]
}
catch
{
}
あなたがしたいことは、特定の既知のエラーをキャッチすることです。
try{
[some task]
}
catch(Exception ex)
{
if([known execption])
[ignore]
else
throw(ex);
}
[Cleanup]
この場合、エラーが再度スローされた場合、クリーンアップコードは実行されません。したがって、新しいエラーがスローされた場合でも実行されるfinallyを追加します。
try{
[some task]
}
catch(Exception ex)
{
if([known execption])
[ignore]
else
throw(ex);
}
finally
{
[Cleanup]
}
「最終的に」ブロックは常に実行されます。
2番目の例では、catchブロックが例外を再スローした場合、またはtryブロックでキャッチされなかった例外が発生した場合、クリーンアップは行われません。
GeekInterviewの this フォーラムから:
Finallyブロックは、tryブロックが終了すると常に実行されます。これにより、予期しない例外が発生した場合でも、finallyブロックが確実に実行されます。ただし、最後に、例外処理以上の場合に役立ちます。これにより、プログラマは、リターン、続行、またはブレークによって誤ってクリーンアップコードがバイパスされるのを回避できます。例外が予想されない場合でも、finallyブロックにクリーンアップコードを配置することは常に良い習慣です。
最初の例では、try句にreturnステートメントがある場合でも、finallyブロックは常に実行されます。実行されないのは、System.exit(0)がある場合のみです。
単に1行の説明:
例外をキャッチしたかどうかに関係なく、finally
ブロックのコードが実行されます。
ここで指定した2つの部分の違いは、finally
を使用しない部分のコードは実行されないということです。
finally
を正しく理解するには、finally
=保証することだけを知っておく必要があります。
クリーンアップ、使いやすさの向上、または再試行に使用できます