私は現在javaを勉強しております。
ファイル入出力時のクローズ処理について疑問に感じたのですが、finally句でクローズ処理を行う際に
if(reader != null){reader.close();}
と記述すると思うのですが、このnullチェックが何をしているのかがわかりません。
私の経験上このif文がfalseになることはなかったと思うのですが、falseになる条件は何なのでしょうか。
一応上記の記述の直前に
reader = null;
と記述すればfalseにはなるのですが、このような記述を行うべき場合があるということなのでしょうか。
カバレッジテストを行う際に毎回この部分だけ通らないのもすっきりしないので、よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
質問の意図とずれてしまいますが、Java7以降であればtry-with-resourcesを使いクローズ処理をお任せしてしまう方がいいと思います。
Java7 体当たり/try-with-resources Statement - 日々常々
投稿2015/11/25 02:16
総合スコア3541
0
finallyでクローズ処理を行う場合、
java
1try{ 2 Reader reader = ...; //何かしらのReader生成 3} finally { 4 reader.close(); 5}
とは書けません。readerのスコープはtryブロックの中だけなので、こう書くとfinallyブロックで変数readerを処理できずにコンパイルエラーになります。
そのため、このように書くことになります。
java
1Reader reader = null; 2try{ 3 reader = ...; //何かしらのReader生成 4} finally { 5 reader.close(); 6}
しかしこの場合、Reader生成の段階で例外が発生した場合にreaderがnullのままになります。
その状態でcloseしようとした場合、今度はNullPointerExceptionが発生します。
この場合、Readerで発生した例外は見えなくなってしまうのです。
そのため、closeする前にnullチェックする必要があるのです。
投稿2015/11/25 02:00
総合スコア20649
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
finally句があるということは、その前にtry句があって、try句が使われているのは例外発生の可能性のある文が存在する事を意味しています。
例えば、readerオブジェクトを生成する文で例外が発生したためにreader==nullの状態でfinally句の実行が始まる事が考えられます。
そうした際にreader.close()が例外とならないように、if(reader != null)との条件判断が入っているのです。
もちろん、readerオブジェクトがnullでないことが、tryブロックに入る前に確認できていて、try句とexcept句の中でreaderが変更されないことが判っていれば、if(reader != null)は不要です。
こうした事は、try-except-finallyブロック全体を見ないと判りませんので、質問にはブロック全体を記載してください。
例外、特にファイルや入出力機器などの装置に関連した例外は事前に予測することが不可能ですので、どのような事態にも対処できるようにプログラムを作ります。
たとえば、ファイルが存在している事を確認して、その後にファイルを開くプログラムを実行した際、ファイルを開く直前にディスク装置が故障して、ファイルを開くことが出来ないという例外が発生するといった事態に遭遇する事は、非常に稀です。
しかし、そうした事に遭遇した経験が無くても、対処するexcept句やfinally句で手抜きをすべきではないと思います。
投稿2015/11/25 02:29
総合スコア6915
0
私はNPE(NullPointerException)が発生するのが大嫌いなので、こういうコードをよく書きます。ファイルがオープンできないとnullになってしまいますから、closeメソッドを呼び出そうとしてもNPEが発生します。NPEはデバッグが大変なので極力避けたいです。
投稿2015/11/25 02:50
退会済みユーザー
総合スコア0
0
readerのインスタンスが破棄されたときnullになるので、ほぼfalseにはならないです。
たとえばcloseまでに大分時間がかかり、破棄されている場合や、コードの処理により初期化を行っている場合(スレッド処理系だと在りがちです)などでしょうか。
通例的にnullチェックをいれ例外とならない場合が考えられない場合も入れるほうが無難です。ロジックが今後変る場合もありますし。
投稿2015/11/25 01:59
総合スコア590
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/25 02:54