
最近、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 例外を投げる必要がないのではないですか?
長文失礼しました。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
ファイルアクセスなどにおけるcloseの例外は、実は殆どの場合「開いてないのにcloseする」というケースだったりします。
要するに、openに失敗して開けなかったとき、最後にcloseがあると、「開いてないのに閉じようとする」ので例外になるのです。こういう場合、そもそも「closeはしなくていい」わけなので何もすることはありません。この回答への補足
回答ありがとうございます。
> closeの例外は、実は殆どの場合「開いてないのにcloseする」というケースだったりします
つまり二重に close() を呼び出すようなコーディングをしてしまっている場合ということですか?
その場合はコードに問題があるので、そもそも try / catch で対応するような状況ではないと思います。
また、何らかの事情で close() を複数回呼び出すことが避けられないような場合(=例外を握り潰すべき場合)と、
ANo.1氏が問題に対処するべきとした、「真の」close() 失敗の区別は飛んできた IOException を見て判断できるのでしょうか?
No.1
- 回答日時:
close()で例外が発生したファイルに対して、それを正常な状態に戻すためにできることは実際ほとんどないと言っていいでしょう。
何かするとすれば、
・「ファイルを正しくclose()できませんでした。ファイルが壊れている可能性があります。」のようなメッセージを表示する
・可能ならclose()に失敗したファイルを一度削除して、ファイルの作成・書き込みをやり直す
などでしょうか。
上記のような処理を行うためにはclose()で問題が発生したことを知る必要があり、そのような時には例外を投げてくれないと困ります。
この回答への補足
早速の回答ありがとうございます。
> 上記のような処理を行うためにはclose()で問題が発生したことを知る必要があり
なるほど。ということは例外に対処する術がない(ほとんどの)場合は、
補足した例外を呼び出し元に投げ返すのが正しい作法ということでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
close()で例外が投げられる理由
-
パスワードを外部ファイルから...
-
where can I buy snowbord in t...
-
エクセルVBA コードが同じでも...
-
MATLAB グローバル変数の宣言
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルを途中行まで...
-
複数ファイル?処理させる方法...
-
Windowsで複数のファイルを同じ...
-
[Perl]ファイル出力のエンコー...
-
【C++/CLI】ファイルオープンに...
-
[Perl]Shift-JISのXMLを解析する場
-
エクセルVBAで素数だけを出力す...
-
Firefox で file:// で始まる U...
-
openした後、closeしないでプロ...
-
JavaでCSVファイルを高速に読む...
-
外部サーバーにあるファイルを...
-
タブの色を変更する方法
-
ifstream/ofstream について
-
【Access2003】VBAでタブ区切り...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
close()で例外が投げられる理由
-
改行コードが勝手に
-
このスクリプトの意味を教えて...
-
レコードの書込み判断
-
携帯でのカウンタ
-
map関数についての質問です
-
cgiでdocument.writeの書き出し
-
perlのflock関数でロックをかけ...
-
GD.pmで作成した画像を保存する...
-
マッチ演算子に変数をはさんで...
-
GDモジュールについて
-
perlの最適化に取り組む際のa.o...
-
DBMオープン時の警告
-
where can I buy snowbord in t...
-
Perl変数から外部プログラムの...
-
Perlの書き方
-
プログラムのヒントを下さい
-
HTMLから自動的に文章取得
-
perlを用いた特定文字列間の抽...
-
cgiの投票回数制限設定について...
おすすめ情報