web-dev-qa-db-ja.com

なぜfinallyブロックを使用するのですか?

私の知る限り、次のコードスニペットはどちらも同じ目的を果たします。なぜfinallyブロックがあるのですか?

コードA:

try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }

コードB:

try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code
84
Mohammad Nadeem
  • 処理していない例外がスローされた場合はどうなりますか? (あなたがThrowable...をキャッチしていないことを願っています)
  • Tryブロック内から戻った場合はどうなりますか?
  • Catchブロックが例外をスローするとどうなりますか?

finallyブロックはただしがそのブロックを終了することを確実にし(プロセス全体を明示的に中止するいくつかの方法を法として)、それは実行されます。これは、リソースの確定的なクリーンアップにとって重要です。

136
Jon Skeet

(Java少なくとも、おそらくC#でも)tryなしでcatchブロックを持つことも可能ですが、finallytryブロックで例外が発生すると、finallyブロックのコードが実行されてから、例外がスローされます。

InputStream in = new FileInputStream("somefile.xyz");
try {
    somethingThatMightThrowAnException();
}
finally {
    // cleanup here
    in.close();
}
11
Jesper

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();
}
7
Balaji Natesan

最後に常に実行されますが、catch後のコードでは実行されない場合があります。

5
Sruly

アプリケーションが強制的に閉じられても、これらのコード行をfinallyブロックに記述して実行すると、実行する必要があるいくつかのタスク(メモリの解放、データベースの終了、ロックの解放など)が実行されます例外がスローされるかどうか...

アプリケーションはスレッドのコレクションである場合があります。Exceptionはスレッド全体を終了しますが、アプリケーション全体を終了するわけではありません。この場合、finallyの方が便利です。

JVMの失敗、スレッドの終了など、finallyが実行されない場合があります。

2
Sandeep P

スローされる可能性のある例外に関係なく、そのコードを実行する必要があるからです。たとえば、一部のアンマネージリソースをクリーンアップする必要がある場合があります( 'using'構成はtry/finallyブロックにコンパイルされます)。

1
Ed S.

最後にJavaでブロックして、ファイルのクローズ、接続のクローズなどの「クリーンアップ」コードを配置するために使用できます。


プログラムが終了した場合(System.exit()を呼び出すか、プロセスを中止させる致命的なエラーが発生した場合)、finallyブロックは実行されません。

0
Aakersh Sharma

Catchブロックが例外をスローした場合、残りのコードは実行されないため、finallyブロックを作成する必要があります。

0
Reshma Kore

まだ下にスクロールしますか?どうぞ!

この質問はしばらく前に私に苦労しました。

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);
}

この場合、出力は次のようになります。

  • 最後にブロック
  • ex.Message-それが何であれ。

例外をキャッチして他のレイヤー(Funneling)に再度スローすると、スロー後のコードが実行されないことは明らかです。これは、関数内のreturnが機能する方法と同様に機能します。

Catchブロックの後にコードのリソースを閉じない理由がわかったので、finallyブロックに配置します。

0
Ashique razak

finallyは常に実行されますが、JVMがシャットダウンされていない限り、finallyはクリーンアップコードを1か所に配置する方法を提供するだけです。

catchブロックのそれぞれにクリーンアップコードを配置しなければならない場合、面倒です。

0
Mahmoud Hanafy

何があってもコードを実行したい場合があります。例外がスローされるかどうか。次に、finallyを使用します。

0
Egalitarian