web-dev-qa-db-ja.com

最終的に使用する方法

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;

もう一方の

42
Martijn

それらは異なる場合

  • tryブロックは、_Java.lang.Throwable_ではない_Java.lang.Exception_をスローすることで完了します。たとえば、AssertionErrorOutOfMemoryErrorなどの_Java.lang.Error_であるためです。
  • continuebreakreturnなどの制御フローステートメントを使用して、tryブロックが突然完了する
  • catchブロックは、(スロー可能オブジェクトをスローするか、制御フローステートメントを使用して)突然完了します。

より一般的には、Java言語は、tryステートメントが完了する前にfinallyブロックが実行されることを保証します(tryステートメントが完了しない場合、finallyは保証されません。Aステートメントは、ハードウェアシャットダウン、OSシャットダウン、VMシャットダウン(たとえば、_System.exit_による)、スレッド待機中(Thread.suspend()synchronizedObject.wait()Thread.sleep())またはその他のビジー状態(無限ループ、、、、)。

したがって、finallyブロックは、メソッド本体の終わりよりもクリーンアップアクションのより良い場所ですが、それ自体では、クリーンアップの実行を保証できません。

38
meriton

finallyブロックは常に実行されます。

finallyブロックは、try/catch内で使用されたリソースを解放したり、db接続を閉じたり、ソケットを閉じたりするなど、クリーンアップに使用されます。 try/catchブロック。

finallyブロックが実行されないのは、try/catchsystem.exit()が呼び出されたとき、または例外の代わりにエラーが発生したときだけです。

上記の説明のエラーは、Javaアプリケーションがメモリ不足エラーなどの条件で終了する場合を意味します。このため、いくつかの反対票が表示されます:(.

30
YoK

主な違いは、catchセクション自体が例外をスローしたり、周囲のブロックから抜け出したり、現在のメソッドから戻ったりする可能性があることです。その場合do; some; cleanup;は実行されません。

finallyブロックでは、そのコードが実行されるのは保証です。

19
Dan

すべての例外をキャッチすることは基本的に悪い考えです。そのため、キャッチされなかった例外がtry/catchまたはtry/catch/finallyブロックの外に伝播した場合にどうなるかを考慮する必要があります。最後に、ブロックを使用すると、途中で片付けることができます。

また:

  • Catchブロックは例外をスローする可能性があります
  • Tryブロックから戻ることができます

簡単に言うと、try/catchブロックを離れるときにコードを実行したい場合ただしあなたは(プロセスが非常に強く終了することを除いて)それを離れることになり、最終的にあなたの友人になります。

11
Jon Skeet

適切なコーディングスタイルでは、以下のようにすべてをキャッチする必要はありません。

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]
}
9
Jonathan Park

「最終的に」ブロックは常に実行されます。

2番目の例では、catchブロックが例外を再スローした場合、またはtryブロックでキャッチされなかった例外が発生した場合、クリーンアップは行われません。

7
iandisme

GeekInterviewの this フォーラムから:

Finallyブロックは、tryブロックが終了すると常に実行されます。これにより、予期しない例外が発生した場合でも、finallyブロックが確実に実行されます。ただし、最後に、例外処理以上の場合に役立ちます。これにより、プログラマは、リターン、続行、またはブレークによって誤ってクリーンアップコードがバイパスされるのを回避できます。例外が予想されない場合でも、finallyブロックにクリーンアップコードを配置することは常に良い習慣です。

3
Kyra

最初の例では、try句にreturnステートメントがある場合でも、finallyブロックは常に実行されます。実行されないのは、System.exit(0)がある場合のみです。

0
Nada Aldahleh

単に1行の説明:

例外をキャッチしたかどうかに関係なく、finallyブロックのコードが実行されます。

ここで指定した2つの部分の違いは、finallyを使用しない部分のコードは実行されないということです。

finallyを正しく理解するには、finally =保証することだけを知っておく必要があります。

クリーンアップ、使いやすさの向上、または再試行に使用できます

0
ligerdave