- 締切済み
close()で例外が投げられる理由
最近、Java を勉強しはじめておるのですが、ファイル入出力処理で例えば、out.txt なるファイルを出力するサンプルとして FileWriter out = null; try { wt = new FileWriter("out.txt"); out.write("はろー"); } catch ( IOException e ) { e.printStackTrace(); } finally { try { if (out != null ) out.close(); } catch (IOException e) { e.printStackTrace(); } } という風に、FileWriter オブジェクト out をクローズする時に IOException 例外が投げられる可能性に対処するため、try / catch でこれをつかまえるように、と聞きました。 そして驚くべきことに、close() が例外を投げた時の catch 節には特に書くべき処理はない、というのです。 そこで質問です。 1. 本当に FileWriter#close() の IOException 例外に対処するためのコードは不要なのですか?(常に握り潰しているだけ?) 2. 対処するコードが不要なら、そもそも FileWriter#close() が IOException 例外を投げる必要がないのではないですか? 長文失礼しました。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
ファイルアクセスなどにおけるcloseの例外は、実は殆どの場合「開いてないのにcloseする」というケースだったりします。要するに、openに失敗して開けなかったとき、最後にcloseがあると、「開いてないのに閉じようとする」ので例外になるのです。こういう場合、そもそも「closeはしなくていい」わけなので何もすることはありません。
- salsberry
- ベストアンサー率69% (495/711)
close()で例外が発生したファイルに対して、それを正常な状態に戻すためにできることは実際ほとんどないと言っていいでしょう。 何かするとすれば、 ・「ファイルを正しくclose()できませんでした。ファイルが壊れている可能性があります。」のようなメッセージを表示する ・可能ならclose()に失敗したファイルを一度削除して、ファイルの作成・書き込みをやり直す などでしょうか。 上記のような処理を行うためにはclose()で問題が発生したことを知る必要があり、そのような時には例外を投げてくれないと困ります。
補足
早速の回答ありがとうございます。 > 上記のような処理を行うためにはclose()で問題が発生したことを知る必要があり なるほど。ということは例外に対処する術がない(ほとんどの)場合は、 補足した例外を呼び出し元に投げ返すのが正しい作法ということでしょうか?
補足
回答ありがとうございます。 > closeの例外は、実は殆どの場合「開いてないのにcloseする」というケースだったりします つまり二重に close() を呼び出すようなコーディングをしてしまっている場合ということですか? その場合はコードに問題があるので、そもそも try / catch で対応するような状況ではないと思います。 また、何らかの事情で close() を複数回呼び出すことが避けられないような場合(=例外を握り潰すべき場合)と、 ANo.1氏が問題に対処するべきとした、「真の」close() 失敗の区別は飛んできた IOException を見て判断できるのでしょうか?