プロが教えるわが家の防犯対策術!

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

http://www.atmarkit.co.jp/fjava/rensai2/javaent1 …
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

A 回答 (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();
    • good
    • 7
この回答へのお礼

ありがとうございます。

>現実的には、キーボードからの入力でIOExceptionが発生することは、
>ほとんどあり得ないと思います。
>そもそも、キーボードが故障していたとしても、
>IOExceptionは投げられないでしょう。

なるほど。

>追伸2:
>そのプログラムでIOExceptionを発生させる最も簡単な方法は、
>readLine()を呼び出す前に
>標準入力(System.in)を閉じてしまうことです。
>System.in.close();

具体例のおかげで、だいぶん分かった気がします。
この場合、InputStream に、もともとの想定以外の
動作をしてやると起こるのですね。

お礼日時:2005/10/16 10:11

BufferedReader の readLine メソッドが IOException を起こす場合のひとつは BufferedReader が関連付けられているストリームがすでにクローズしていた場合があります。


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

この回答への補足

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

補足日時:2005/10/11 21:52
    • good
    • 1

インプットが InputStreamReader(System.in)


ということで、キーボード入力から受け取りますよね。

そこで発生する IOException はキーボード入力でエラーがあった場合に発生すると考えられます。

キーボードでエラーが発生するケースとは何が考えられるでしょうか?
ということで、この例では
System.out.println( "キーボードが故障しているのかもしれません" );
となっています。

別にハードの故障を読み取ってるわけではないので「かもしれません」になっているのです。

この回答への補足

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

補足日時:2005/10/11 21:44
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A