Codeへの愛とCuriosity

CodeIQ への出題・解説解題・その周辺について、思いつくままに。

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

と書いたところ、教えていただいたので tweet をはっておく。

どうも、try に両方書くのが厳密には正解だけど、書いても意味がある場合が稀なので最初に上げた例のように書くことが多い、ということみたい。

以下、10/24の 19時ごろ更新

さらに情報を頂いたので貼ります。張ります。

BufferedReader のコンストラクタ内で例外が発生するのが「対応不可能」だったり「保証のない特殊な状況」だったりするということみたい。
私は Java力不足で判断は保留。
少しずつ調べていこうと思っている。

それと。


nio なら迷いがないということみたい。
なるほど。

そして続編
FileReader が必ず close されるのかどうかの続き - Codeへの愛とCuriosity