web-dev-qa-db-ja.com

Javaでtry-catchブロックの後に「最終的に」使用する利点は何ですか?

「最終」ブロックは、例外の有無にかかわらず、try-catchが終了すると常に実行されます。しかし、try-catchの外側と後のコードのすべての行は常に実行されます。それでは、なぜfinallyステートメントを使用する必要がありますか?

例:

try {
    //code...
} catch (Exception e) {
    //code...
} finally {
    System.out.println("This line is always printed");
}
System.out.println("Also this line is always printed !! So why to use 'finally'?? ");
40
Aarath

最も有用なケースは、いくつかのリソースを解放する必要がある場合です。

InputStream is = ...
try {
    //code...
} catch (Exception e) {
    //code...
} finally {
    is.close();
}

より一般的には、実行中に例外が発生した場合でも、コードが最後に確実に実行されるようにする場合に使用します。

long startTime = System.currentTimeMillis();
try {
    //code...
} catch (Exception e) {
    //code...
} finally {
    long endTime = System.currentTimeMillis();
    System.out.println("Operation took " + (endTime-startTime) + " ms");
}

このfinallyブロック常にが実行されるという考えは、ブロック全体に続く最初の行には当てはまらないということです。

  • catchブロックがスロー可能なパスを許可する場合
  • 非常に頻繁に発生する例外を再スローする場合
22
Denys Séguret

最後 System.out.println(finallyブロックの後)は、tryブロックでスローされた例外がcatchブロックで実際にキャッチされ、実行が中断されない場合にのみ実行されます。 returnステートメント。

あなたの例では、finallyブロックは常に実行されますが、Errorがtryブロックでスローされない場合(キャッチされない場合)、Throwableはcatchブロックでスローされ、実行を中断する他のステートメントはありません。

7
jarnbjo

しかし、try-catchの外側と後のコードのすべての行は常に実行されます

これは間違っています。未チェックの例外(RuntimeException、Error、およびそれらのサブクラス)の場合、finallyの後のコードは実行されません。

このコードを見てください

public static void main(String[] args) {
    try{
        someDengerousMethod();
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        System.out.println("finally block");
    }
    System.out.println("after finally...");
}
public static void someDengerousMethod(){
    throw new Error("something went wrong");
}
4
Pshemo

Finallyブロックは、リソースリークを防ぐための重要なツールです。ファイルを閉じるとき、またはリソースを回復するときは、コードをfinallyブロックに配置して、リソースが常に回復されるようにします。

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

もっと こちら

0
tmwanik