他の回答では、 をスローせずに JVM を終了した場合にcatch
およびfinally
ブロックが実行されない方法について説明していますが、リソースへの「try-with-resources」ブロックで何が起こるかは示されていません。System.exit
SecurityException
JLS によると、セクション 14.20.3.2 :
変換の効果は、リソース仕様を try ステートメントの「内側」に置くことです。これにより、拡張された try-with-resources ステートメントの catch 句で、リソースの自動初期化またはクローズによる例外をキャッチできます。
さらに、finally キーワードの意図に沿って、finally ブロックが実行されるまでに、すべてのリソースが閉じられている (または閉じようとしている) ことになります。
つまり、またはブロックが実行されるclose
前にリソースが削除されます。走らなくても何とかdされたら?catch
finally
close
catch
finally
「try-with-resources」ステートメントのリソースも閉じられていないことを示すコードを次に示します。
BufferedReader
を呼び出す前にステートメントを出力する単純なサブクラスを使用しsuper.close
ます。
class TestBufferedReader extends BufferedReader {
public TestBufferedReader(Reader r) {
super(r);
}
@Override
public void close() throws IOException {
System.out.println("close!");
super.close();
}
}
System.exit
次に、try-with-resources ステートメントで呼び出すテスト ケースを設定します。
public static void main(String[] args)
{
try (BufferedReader reader = new TestBufferedReader(new InputStreamReader(System.in)))
{
System.out.println("In try");
System.exit(0);
}
catch (Exception e)
{
System.out.println("Exception of type " + e.getClass().getName() + " caught: " + e.getMessage());
}
finally
{
System.out.println("finally!");
}
}
出力:
試しに
したがって、docatch
およびブロックが実行されないだけでなく、"try-with-resources" ステートメントが成功した場合、そのリソースfinally
にチャンスがありません。close
System.exit