
IOException ってどういうときに起こるのでしょうか?
http://www.atmarkit.co.jp/fjava/rensai2/javaent1 …
を見て勉強しています。
catch ( IOException e) {
System.out.println( "キーボードが故障しているのかもしれません" );
}
と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「
NumberFormatException の方はわかるのですが・・・
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();
ありがとうございます。
>現実的には、キーボードからの入力でIOExceptionが発生することは、
>ほとんどあり得ないと思います。
>そもそも、キーボードが故障していたとしても、
>IOExceptionは投げられないでしょう。
なるほど。
>追伸2:
>そのプログラムでIOExceptionを発生させる最も簡単な方法は、
>readLine()を呼び出す前に
>標準入力(System.in)を閉じてしまうことです。
>System.in.close();
具体例のおかげで、だいぶん分かった気がします。
この場合、InputStream に、もともとの想定以外の
動作をしてやると起こるのですね。
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/ja …
を見ても、単に「IOException - 入出力エラーが発生した場合」としか書かれていないので、ご質問のような疑問が生まれたのだろうと思います。
このような現状においては、アプリケーションプログラムの側では、「IO エラーです」のようなメッセージの表示でお茶を濁すしかないと思います。下手に意訳するのはやめたほうが無難かもしれません。
挙げられた URL のページの解説も、ほどほどに見られることにとどめられたほうが良いと思います。
この回答への補足
ありがとうございます。
やはり、具体的なイメージが湧かないのですが、
「BufferedReader が関連付けられているストリームがすでにクローズ」
というのは、何らかのトラブル(例えば、OSの不具合)とかで起こる者なのでしょうか?具体的な例とか状況でわかりやすいものはないでしょうか?
まだIOErrorに巡り会ったことがないので・・。
No.1
- 回答日時:
インプットが InputStreamReader(System.in)
ということで、キーボード入力から受け取りますよね。
そこで発生する IOException はキーボード入力でエラーがあった場合に発生すると考えられます。
キーボードでエラーが発生するケースとは何が考えられるでしょうか?
ということで、この例では
System.out.println( "キーボードが故障しているのかもしれません" );
となっています。
別にハードの故障を読み取ってるわけではないので「かもしれません」になっているのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
close()で例外が投げられる理由
Java
-
ループ処理の際、最後だけ,"をつけたくない"
Java
-
Eclipseのアンインストールの仕方
Java
-
4
Path型をString型へ変換する(Java)
Java
-
5
interface,extend,implementのちがい
Java
-
6
「例外 *** は対応する try 文の本体ではスローされません。」について。
Java
-
7
エラーを起こす方法
Oracle
-
8
文字列を日付に変換でParseException
Java
-
9
flush()とclose()について
Java
-
10
DTOとEntityの差は何ですか。
Java
-
11
[JAVA]try 内の変数を外で!?
Java
-
12
Eclipseで、プロジェクト名のところに赤いバッテンのエラーマークが
Java
-
13
Junitテストでvoid戻り値メッソドをテストする方法
Java
-
14
【C#/Java?】try-catchでcatchせずにfinallyは一般的?
その他(プログラミング・Web制作)
-
15
[Ljava.lang.Stringってなんですか
Java
-
16
Javascript_submit()完了後に処理したい
JavaScript
-
17
private static という変数の修飾
Java
-
18
レコード件数の表示
Java
-
19
単一グループのグループ関数ではありません。
Oracle
-
20
java junit list同士の比較方法
Java
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
「G」の小文字入力の切り替え
-
5
単語登録 + 単語で日付と変...
-
6
times new romanでギリシャ文字...
-
7
エクセルの入力がダブる・・・(...
-
8
バッファロー社製『BSHSBT04BK...
-
9
英字が打てません iPad Air キ...
-
10
ファイル名変更時にファイルが...
-
11
EOFError: EOF when reading a ...
-
12
携帯電話でローマ字入力を可能...
-
13
キーボードを交換しても同じキ...
-
14
タッチタイピングの上達方法を...
-
15
iPhoneのキーボードについてで...
-
16
【タブレットPC】フォーム画面...
-
17
書くと、コピーペーストは、同...
-
18
PCのキーボードにFnキーが無い...
-
19
今すぐキーボードのUからQま...
-
20
HIDキーボードデバイスとは何で...
おすすめ情報
公式facebook
公式twitter