
最近、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で質問しましょう!
似たような質問が見つかりました
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Java すみません。助けてください。 javaについての質問です。 integerに変換できない数値をエラー 5 2022/05/18 19:16
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlでハードウェア制御?
-
close()で例外が投げられる理由
-
Perlの書き方
-
改行コードが勝手に
-
where can I buy snowbord in t...
-
perlでのスキンの利用方法
-
ファイルから読み込んだ文字を
-
エクセルVBA コードが同じでも...
-
空白を含む文をファイルに書き...
-
batファイルでrenameができませ...
-
C言語で特定の行を抽出する方法...
-
fgets で値が取得できない
-
VBAでCSVファイルを途中行まで...
-
無料配布の郵便番号自動入力cgi...
-
CSVファイルのダウンロードにつ...
-
下のディレクトリ(3つ)に含ま...
-
Windowsで複数のファイルを同じ...
-
MATLAB グローバル変数の宣言
-
fopenでディレクトリ内の全ファ...
-
vNoteのBODY部の取得(長めです)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
close()で例外が投げられる理由
-
perlのflock関数でロックをかけ...
-
改行コードが勝手に
-
where can I buy snowbord in t...
-
ファイルのロックについて
-
perlで複数のファイルの処理に...
-
perlを用いた特定文字列間の抽...
-
変数を使ってファイル名を自分...
-
open中のファイルをrename
-
文字列比較がどうしてもできま...
-
データの入れ替え処理が巧くで...
-
perlで大容量CSVのsort方法につ...
-
テキストファイルの本文中に行...
-
初歩的な質問で恐縮です。
-
パイプをopenして/usr/bin/grep...
-
perlでのスキンの利用方法
-
ログに記録又は読み出す際、最...
-
Perlのファイルオープン時...
-
Perlでハードウェア制御?
-
perlでファイル内の文字列を置...
おすすめ情報