• ベストアンサー

Try-catch文(FileInputStream)

下記コードでエラーが出現して困っています。 fis.close();の部分でコンパイルエラー( 変数 fis は初期化されていない可能性があります。)の結果が返ってきます。 必ず通過するfinallyブロックにclose()処理を記述して、この処理もエラーが発生する可能性があるので、try-catchする必要があると教師が言っていました。 エラーが出現する原因はなぜでしょうか? 回答のほどよろしくお願い致します。 FileInputStream fis; try{ fis = new FileInputStream(fi.getAbsolutePath()); while( (b[i++] = fis.read()) != -1); }catch(FileNotFoundException e){ } catch(IOException e){ }finally{ try{ fis.close(); ←コンパイルエラー( 変数 fis は初期化されていない可能性があります。) }catch(IOException e){ } }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>FileInputStream fis; 「初期化されていない可能性」=「変数 fis には値が入ってない場合がある」ということです。正確には何が入っているか分からないということでしょう。 FileInputStream fis = null; としてやればとりあえずOKでしょう。 >fis = new FileInputStream(fi.getAbsolutePath()); この行で値は確定するはずですが 最初の try { と fis = new FileInputStream(fi.getAbsolutePath()); の間に別のソースがあって実行時例外(Exception)をおこした場合、 または fi.getAbsolutePath() だって例外を起こす可能性はあります。 そうなると fis には値が設定されぬまま catch に続いて finally に飛び込んでくるということになります。 コンパイラは親切心(?)でエラーを出してくれています。

akatuki200
質問者

お礼

分かりやすい回答ありがとうございます。 おかげでコンパイルエラーが解消されました。 本当に感謝いたします。

その他の回答 (4)

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.5

>> 3rate-engineer さん だんだん話がそれますが、finalize があるからといって自分で close をしなくてよいということにはなりません。finalize がいつ呼び出されるのかというのはガーベジコレクタの動作に依存するので、finalize がすぐに呼び出されなかった場合にはリソースが解放されないままになります。 finalize があるのは万一 close をし忘れた場合の保険と考えるべきです。 あと、 > OutputStreamもfinalizeを実装してます というのはちょっと語弊があるような……。

回答No.4

#2さんの回答に補足ですが >fis.close()において、もし、fisがnullならnullpointerとなってしまいます。 あらら… finally 中で try {} catch(Exception e){}で囲っていると思っていたら IOException だったんですね…。 finally中では #2さんのやり方か try { fis.close(); } catch(Exception e){} でいいと思いますよ。

回答No.3

アドバイスっていうか あげあしっていうか 余計なお世話かもしれませんが・・・ FileinputStreamはfinalizeメソッドを実装していて その中でcloseをやっているから わざわざfinallyを実装しなくてもいい だったかとおもいますが・・・ もちろん通常の流れでのclose()とty-catchはやるべきでしょうが あと同様にOutputStreamもfinalizeを実装してます。

  • ratsbane
  • ベストアンサー率40% (4/10)
回答No.2

FileInputStream fis; を FileInputStream fis = null; にして、 fis.close(); を if(fis != null){   fis.close(); } にするとどうでしょうか? 初期化されてない可能性というは、 fis = new FileInputStream(fi.getAbsolutePath()); で、例外が発生(newするときに発生)した場合、 fisという変数は何も参照しておらず、初期化されていない 状態(nullでもない)ということだと思います。 try-catchはおかしくないと思います。 fis.close()において、もし、fisがnullならnullpointerとなってしまいます。

関連するQ&A