FileReader が必ず close されるのかどうか。
Java で、
try (BufferedReader br = new BufferedReader(new FileReader(path))) { // do something. }
というような記述をよく見る。
実際、上記のコードは Oracle 様 のサイト
http://docs.oracle.com/javase/jp/7/technotes/guides/language/try-with-resources.html
から連れてきたもの。
しかし。これって、 BufferedReader のコンストラクタとかその直前にあるはずのメモリ確保とかが例外を発生させると FileReader が close されないよね。
というわけで、
try ( FileReader fr = new FileReader(path); BufferedReader br = new BufferedReader(fr) ) { // do something. }
と書くべきだと思うんだけど、どうなんだろ。
以下、10/24の 午前1時ごろ更新
で。
Twitter に
#Java の try-with-resources についての記事
http://t.co/ucb7MH7FS5
を書いたよ。
教えて偉い人。
— 鍋谷 武典 (@Nabetani) 2014, 10月 23
と書いたところ、教えていただいたので tweet をはっておく。
@Nabetani 後者の方がより正しいのですがBufferedReaderのメモリ確保で失敗するような状況でFileReaderをcloseするだけのメモリを確保できるのか疑わしいですし、
— 太一 (@ryushi) 2014, 10月 23
@ryushi @Nabetani OutOfMemoryErrorが発生したらその後正常に動く保証はないので、宣言を別にしても閉じられない可能性があるのは同じですね
— 山本://裕介 (@yusuke) 2014, 10月 23
どうも、try に両方書くのが厳密には正解だけど、書いても意味がある場合が稀なので最初に上げた例のように書くことが多い、ということみたい。
以下、10/24の 19時ごろ更新
さらに情報を頂いたので貼ります。張ります。
@Nabetani @ryushi Errorが発生した場合に対応するコードを書くのは「厳密には正確」ではないんじゃないかと。Throwableを継承するクラスで、Exceptionはプログラムで対応可能、Errorは対応不可能なものなので
— 山本://裕介 (@yusuke) 2014, 10月 24
@Nabetani
BufferedReaderのcloseでFileReaderのcloseが呼ばれるので、分けて書くと2回FileReaderのcloseが発生します。
保証のない特殊な状況のために、普段余分なステップ発生させるのでは本末転倒だと思います。
— チョコレートバー (@Air_Hold) 2014, 10月 23
BufferedReader のコンストラクタ内で例外が発生するのが「対応不可能」だったり「保証のない特殊な状況」だったりするということみたい。
私は Java力不足で判断は保留。
少しずつ調べていこうと思っている。
それと。
補足ですが、ファイルのパスからBufferedReaderが欲しいのであれば、java.nio.file.Files.newBufferedReaderというAPIがあります。そちらの実装もご確認下さい。
— 太一 (@ryushi) 2014, 10月 23
nio なら迷いがないということみたい。
なるほど。
そして続編
FileReader が必ず close されるのかどうかの続き - Codeへの愛とCuriosity
。