「最終」ブロックは、例外の有無にかかわらず、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'?? ");
最も有用なケースは、いくつかのリソースを解放する必要がある場合です。
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
ブロックがスロー可能なパスを許可する場合最後 System.out.println
(finallyブロックの後)は、tryブロックでスローされた例外がcatchブロックで実際にキャッチされ、実行が中断されない場合にのみ実行されます。 returnステートメント。
あなたの例では、finallyブロックは常に実行されますが、Error
がtryブロックでスローされない場合(キャッチされない場合)、Throwable
はcatchブロックでスローされ、実行を中断する他のステートメントはありません。
しかし、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");
}
Finallyブロックは、リソースリークを防ぐための重要なツールです。ファイルを閉じるとき、またはリソースを回復するときは、コードをfinallyブロックに配置して、リソースが常に回復されるようにします。
しかし、最終的には単なる例外処理以上のものに役立ちます。プログラマーは、リターン、続行、またはブレークによって誤ってクリーンアップコードがバイパスされることを回避できます。例外が予想されない場合でも、finallyブロックにクリーンアップコードを配置することは常に良い習慣です。
もっと こちら