finally
例外処理のブロックは正確に何を実行しますか?
8 に答える
例外が発生したかどうかに関係なく、常に実行する必要のあるコードを保持します。
たとえば、ファイルを開いた場合は、finally
ブロック内でファイルを閉じて、常に閉じられるようにする必要があります。ブロック内で閉じた場合try
、以前の例外により、実行がcatch
ブロックに直接ジャンプし、ファイルの閉じをスキップします。
詳細については、Javaチュートリアルを参照してください。
例外がスローされたかどうかに関係なく、finallyブロックは常に実行されます。私が考えることができる典型的な使用例は、ファイルを閉じることです。
FileOutputStream stream = null;
try{
// do stuff with the stream here
} catch (IOException ex){
// handle exception
} finally{
// always close the stream
if(stream != null){
stream.close();
}
}
ブロックに入ったかどうかに関係なく実行されますcatch
。つまり、オブジェクトの破棄やその他のクリーンアップを行うのに最適な場所です。
コードのブロックに複数のreturnステートメントがある場合にオープンリソースをクリーンアップするためによく使用します。すべてのreturnステートメントの前に同じ「closeresource」コードを複製する必要がないため、コードが非常にクリーンになります。tryセクション内でreturnを実行した場合でも、コードがfinallyセクションを呼び出すことが保証されています。また、プログラマーが誤ってコードを簡単に省略してしまう可能性があるため、この場合のコードの安全性にも役立ちます。
finally ブロックは主に、データベースからの接続を閉じるcon.closeなどの close ステートメントを実行するために使用されます....try ブロックの後には常に catch ブロックまたは finally (またはその両方) が続きます... try ブロックを実行すると、finally ブロックはシステム エラー、finally ブロックの例外を除いて確実に実行されます。
finally キーワードは、例外の発生に関係なく、finally ブロックに存在するコードをすべての状況で実行する必要があることを確認するためにのみ使用されます。
例:
try{
}
catch(Exception e){
}
finally{
System.out.print("finally executed");
}
注: 上記の場合、finally は常に実行されます。
try
ブロックだけでなくorcatch
ブロックでも値を返す場合は、ブロックの戻り値が最終的に得られるもの (最後に実行されたfinally
ブロック) になることに注意してください。finally
つまり、 をtry
スローせException
ず、値を返すはずのコードが、finally
ブロックも値を返すはずの場合、finally
ブロックの値が実際に返されることになります。 この SO スレッドはまさにその点について語っています。try
or内で値を返すことcatch
は、通常、必要または最良のアイデアだとは思いません。またSystem.exit(0)
、JVM を強制終了するため、他の処理が実行される前に実行が停止されるため、finally
ブロックが実行されない可能性があることに注意してください。