最近、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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
IOException ってどういうときに起こるのでしょうか?
Java
-
flush()とclose()について
Java
-
private static という変数の修飾
Java
-
-
4
テーブル内の文字サイズを変更したい。
HTML・CSS
-
5
javaでcsvファイル読込時の改行について
Java
-
6
レコード件数の表示
Java
-
7
「例外 *** は対応する try 文の本体ではスローされません。」について。
Java
-
8
Junitテストでvoid戻り値メッソドをテストする方法
Java
-
9
ファイルクローズ(fclose)でエラーを発生させる方法
C言語・C++・C#
-
10
Path型をString型へ変換する(Java)
Java
-
11
Eclipseのアンインストールの仕方
Java
-
12
Eclipse で同期するたびに読み取り専用ファイルになる
その他(ソフトウェア)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
close()で例外が投げられる理由
-
オープンしたファイルで行の連結
-
perlで大容量CSVのsort方法につ...
-
awkスクリプトでダブルクォーテ...
-
window.open でのファイル指定方法
-
ListBoxのデータを高速でファイ...
-
C言語で特定の行を抽出する方法...
-
ReadLineでの読み出し行を指定する
-
VBAでCSVファイルを途中行まで...
-
パスから最後のディレクトリだ...
-
ヒアドキュメントの書き方
-
Edge スクレイピング
-
ExcelをCSV書き出す場合のシー...
-
CSVデータの編集の際の重複チェ...
-
Perlで特定行から特定行までを...
-
配列の中に重複文字列があるか...
-
utf-8のCSVをshift_jisに変換し...
-
python renameについて
-
openした後、closeしないでプロ...
-
vba dir の相対パス
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
close()で例外が投げられる理由
-
perlのflock関数でロックをかけ...
-
改行コードが勝手に
-
open中のファイルをrename
-
ファイルから読み込んだ文字を
-
perlでファイル内の文字列を置...
-
AutoCADのスクリプト
-
Perl で syntax error
-
perlを用いた特定文字列間の抽...
-
テキストファイルの本文中に行...
-
Perlで他サイトの情報を取得し...
-
オープンしたファイルで行の連結
-
PICでFatFsでオープンした内容...
-
パスワードを外部ファイルから...
-
Perl:ファイルハンドルをスカラ...
-
巨大ファイルの行をを逆順に並...
-
ハッシュにファイルハンドル
-
Perlのファイルオープン時...
-
パイプをopenして/usr/bin/grep...
-
telnet接続
おすすめ情報