• ベストアンサー

IOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか? http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html を見て勉強しています。   catch ( IOException e) {     System.out.println( "キーボードが故障しているのかもしれません" );   } と書いてあります。 ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「 NumberFormatException の方はわかるのですが・・・

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

  • ベストアンサー
  • Gishi
  • ベストアンサー率57% (11/19)
回答No.3

現実的には、キーボードからの入力でIOExceptionが発生することは、 ほとんどあり得ないと思います。 そもそも、キーボードが故障していたとしても、 IOExceptionは投げられないでしょう。 「キーボードが故障しているのかもしれません」というのは、 その記事の著者が冗談で書いたのだと思います。 ではなぜ、try-catchを書かなくてはいけないのか? InputStreamやBufferedReaderは、 データ入力を抽象化したものだからです。 実際の入力元はキーボードだったり、ファイルだったり、 ネットワーク接続だったりするわけですけど、 InputStreamは、その入力元の情報を持っていないので、 データを読み取る際は常に IOExceptionをキャッチするコードを書かなくてはいけません。 たとえ、絶対にIOエラーが発生しないストリームだとしても。 さらに付け加えるなら、 そもそも「標準入力=キーボード」であるとは限りません。 (一般的にはキーボードであることが多いですが。) Javaでは、 System.setIn(InputStream) を呼び出して、標準入力を変えてしまうことができますし、 標準入力を指定してプログラムを実行することができるOSもあります。 追伸1: 例外をキャッチしたときは、 スタックトレースをプリントすることをおすすめします。 catch (IOException e) { e.printStackTrace(); } 追伸2: そのプログラムでIOExceptionを発生させる最も簡単な方法は、 readLine()を呼び出す前に 標準入力(System.in)を閉じてしまうことです。 System.in.close();

white-tiger
質問者

お礼

ありがとうございます。 >現実的には、キーボードからの入力でIOExceptionが発生することは、 >ほとんどあり得ないと思います。 >そもそも、キーボードが故障していたとしても、 >IOExceptionは投げられないでしょう。 なるほど。 >追伸2: >そのプログラムでIOExceptionを発生させる最も簡単な方法は、 >readLine()を呼び出す前に >標準入力(System.in)を閉じてしまうことです。 >System.in.close(); 具体例のおかげで、だいぶん分かった気がします。 この場合、InputStream に、もともとの想定以外の 動作をしてやると起こるのですね。

その他の回答 (2)

  • unibon
  • ベストアンサー率47% (160/340)
回答No.2

BufferedReader の readLine メソッドが IOException を起こす場合のひとつは BufferedReader が関連付けられているストリームがすでにクローズしていた場合があります。 これは BufferedReader クラスのソースコードを見てみると、そのクラスの private なメソッドである ensureOpen で IOException を throw しているのが分かります。しかし、これは複数あるかもしれないケースのひとつでしかなく、また、あくまでも内部仕様です。 BufferedReader クラスを使う側からすれば readLine が IOException を起こすかもしれない、ということだけを知っていれば良いです。かと言って、外部仕様である、 http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/io/BufferedReader.html#readLine() を見ても、単に「IOException - 入出力エラーが発生した場合」としか書かれていないので、ご質問のような疑問が生まれたのだろうと思います。 このような現状においては、アプリケーションプログラムの側では、「IO エラーです」のようなメッセージの表示でお茶を濁すしかないと思います。下手に意訳するのはやめたほうが無難かもしれません。 挙げられた URL のページの解説も、ほどほどに見られることにとどめられたほうが良いと思います。

white-tiger
質問者

補足

ありがとうございます。 やはり、具体的なイメージが湧かないのですが、 「BufferedReader が関連付けられているストリームがすでにクローズ」 というのは、何らかのトラブル(例えば、OSの不具合)とかで起こる者なのでしょうか?具体的な例とか状況でわかりやすいものはないでしょうか? まだIOErrorに巡り会ったことがないので・・。

  • vivlet
  • ベストアンサー率36% (24/66)
回答No.1

インプットが InputStreamReader(System.in) ということで、キーボード入力から受け取りますよね。 そこで発生する IOException はキーボード入力でエラーがあった場合に発生すると考えられます。 キーボードでエラーが発生するケースとは何が考えられるでしょうか? ということで、この例では System.out.println( "キーボードが故障しているのかもしれません" ); となっています。 別にハードの故障を読み取ってるわけではないので「かもしれません」になっているのです。

white-tiger
質問者

補足

すみません。 「キーボード入力でエラー」 というのは例えばどのような状況でしょうか? キーを連続して押すとか?

関連するQ&A