47

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;

もう一方の

4

9 に答える 9

39

次の場合に異なります。

  • try-block は、 ではない a をスローすることによって完了しますjava.lang.Throwablejava.lang.Exceptionたとえばjava.lang.ErrorAssertionErrorまたは などOutOfMemoryErrorです。
  • continuebreakまたは_return
  • catch-block が突然完了する (throwable をスローするか、制御フロー ステートメントを使用することにより)

より一般的には、Java 言語は、try ステートメントが完了する前に finally ブロックが実行されることを保証します。(try ステートメントが完了しない場合、finally についての保証はないことに注意してください。ステートメントは、ハードウェアのシャットダウン、OS のシャットダウン、VM のシャットダウン (たとえば によるSystem.exit)、待機中のスレッドなど、さまざまな理由で完了しない可能性があります。 ( Thread.suspend()synchronizedObject.wait()Thread.sleep()) またはビジー状態 (エンドレス ループ、、、、)。

したがって、finallyブロックはメソッド本体の最後よりもクリーンアップ アクションに適した場所ですが、それでもクリーンアップの実行を保証することはできません。

于 2010-07-31T21:46:04.020 に答える
31

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

finallyブロックは、 /ブロック内で未処理の例外が発生した場合でも、 try/内で使用されているリソースを解放したりcatch、データベース接続を閉じたり、ソケットを閉じたりするなど、クリーンアップに使用されます。trycatch

finallyブロックが実行されないのはsystem.exit()try/catchまたは例外ではなく何らかのエラーが発生したときだけです。

上記の説明のエラーは、Java アプリケーションが Out Of Memory エラーなどの状態で終了した場合を意味します。私はいくつかの反対票を目にします:(この理由でそう思われます。

于 2010-07-28T16:02:19.923 に答える
21

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

finallyブロックを使用すると、そのコードが実行されることが保証されます

于 2010-07-28T16:02:21.687 に答える
13

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

また:

  • catch ブロックが例外をスローする可能性があります
  • try ブロックから戻りたい場合があります

要するに、try/catch ブロックを離れるときに何らかのコードを実行したい場合(プロセスが非常に激しく終了することは別として)、最終的にあなたの友人です。

于 2010-07-28T16:02:53.220 に答える
9

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

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]
}
于 2010-07-28T16:01:15.137 に答える
8

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

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

于 2010-07-28T16:03:10.997 に答える
3

GeekInterview のこのフォーラムから:

try ブロックが終了すると、finally ブロックが常に実行されます。これにより、予期しない例外が発生した場合でも、finally ブロックが実行されます。しかし、finally は例外処理以外にも役立ちます。これにより、プログラマーはクリーンアップ コードが return、continue、または break によって誤ってバイパスされるのを防ぐことができます。例外が予想されない場合でも、最終ブロックにクリーンアップ コードを配置することは常に良い方法です。

于 2010-07-28T16:03:42.627 に答える
0

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

于 2010-07-28T17:48:38.450 に答える
0

単純に 1 行の説明:

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

ここで指定した 2 つの部分の違いは次のとおりです。使用しない部分のコードfinallyは決して実行されません。

正しく理解するためfinallyに、あなたが知る必要があるのはそれだけですfinally= 保証!

クリーンアップしたり、使いやすさを向上させたり、何かを再試行したりするために使用できます

于 2010-07-28T16:52:54.950 に答える