
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も見ています
-
System.err. printlnとSystem.out.printlnはどう違うんでしょうか?
Java
-
SELECT 文の NULL列は?
PostgreSQL
-
count(*)で取得した値をJAVAの変数に代入するには?
Java
-
-
4
.jarファイルの中身って書き換えれる?
Java
-
5
ArrayListの要素数の上限
Java
-
6
エクセルのデータグループ化の際に貼り付けた図だけ一緒に折りたたんでくれません!
Windows Vista・XP
-
7
エクセル指定した範囲からランダムで一つ抽出
Excel(エクセル)
-
8
java eclipse 型に解決できません
Java
-
9
コマンドプロンプトのエラーについて
その他(パソコン・周辺機器)
-
10
javaで質問です。 文字列2023/2/3(一桁の場合、0埋めなし)の場合にyyyyMMddに変換
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
キーボードの誤作動?
-
times new romanでギリシャ文字...
-
助けてください!!キーボード...
-
単語登録 + 単語で日付と変...
-
Centosについての質問です。パ...
-
IOException ってどういうとき...
-
中国語【簡体字】の手書き入力...
-
ノートPCのキーボードで数字...
-
#の入力方法
-
キーボードの子音が入力出来ない
-
「G」の小文字入力の切り替え
-
日本語で入力が出来ません。ど...
-
バックスラッシュのタイプ方法
-
キーボードの「Y」、「U」、「I...
-
【タブレットPC】フォーム画面...
-
ローマ字を覚えず、声入力はで...
-
つにてんてんはどうやってタイ...
-
スマートフォンアプリ
-
二重鍵括弧 『』について教え...
-
かな入力を「ずっと」ONにする...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「G」の小文字入力の切り替え
-
ノートPCのキーボードで数字...
-
助けてください!!キーボード...
-
IOException ってどういうとき...
-
キーボード入力(キー(「Y」「...
-
二重鍵括弧 『』について教え...
-
iPad の分割キーボードでトグル...
-
times new romanでギリシャ文字...
-
単語登録 + 単語で日付と変...
-
パソコンで数字が連続して羅列...
-
【タブレットPC】フォーム画面...
-
①Excel シートに、「=」を入力...
-
ノートパソコンのキーボードが...
-
バッファロー社製『BSHSBT04BK...
-
中国語【簡体字】の手書き入力...
-
Centosについての質問です。パ...
-
キーボードの子音が入力出来ない
-
6がいっぱい自動的に入力されます
-
エクセルの入力がダブる・・・(...
-
スマホでフランス語のeを入力...
おすすめ情報