Javaプログラムを作成しています.
標準入力で入力された文字列を表示し,exitが入力されるまで繰り返すプログラムです.
エラーが出ますが,対策方法がわかりません.
ソースコード,実行結果,エラーは以下の通りです.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("Program starts.");
while (true) {
String input = null;
input = getInputLine();
System.out.println("echo:" + input);
if (input.equals("exit")) {
break;
}
}
System.out.println("Program exits.");
}
private static String getInputLine() {
String input = null;
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(System.in));
input = br.readLine();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return input;
}
}
Program starts.
test
echo:test
echo:null
java.io.IOException: Stream closed
at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145)
at java.io.BufferedInputStream.read(BufferedInputStream.java:308)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at kadai1.Test.getInputLine(Test.java:34)
at kadai1.Test.main(Test.java:18)
Exception in thread "main" java.lang.NullPointerException
at kadai1.Test.main(Test.java:21)
No.2ベストアンサー
- 回答日時:
getInputLineメソッド中に br.close(); という箇所があるのですが、マズイです。
実行開始して1回目の br.readLine(); は上手く実行されるのですが、その後、br.close(); にて標準入力である System.in までリソースを開放してしまいます。そして2回目に br.readLine() が実行されると、標準入力に関連した静的なSystem.inが既に開放されてしまっているので、例外処理となります。標準入力はJavaアプリケーションを実行した時点で暗黙のうちに静的(static)に生成されます。mainメソッドと同様です。それをclose()にて開放してしまうのが原因です。BufferedReaderとInputStreamReaderは2回目以降もオブジェクトが作成されますが、System.inは一旦開放されるとダメっす。
手直ししましたので、ご参考まで。
--------------------------
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class TestBuf {
/**
* @param args
*/
static BufferedReader br = null;
public static void main(String[] args) {
br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Program starts.");
while (true) {
String input = null;
input = getInputLine();
System.out.println("echo:" + input);
if (input.equals("exit")) {
break;
}
}
System.out.println("Program exits.");
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static String getInputLine() {
String input = null;
try {
input = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return input;
}
}
--------------------------
余談ですが、JDK6(1.6)から、キーボード入力を簡単にできます。
private static String getInputLine() {
return System.console().readLine();
}
ご参考まで。
System.inがstaticのことや,br.closeで一緒にリソース開放されるとは
知りませんでした.ご指摘,手直しありがとうございました.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- Java マイクラjavaでForgeを入れたいのですが、インストールした.jarファイルが展開されてしまい中 1 2023/07/28 22:30
- Java jdk17.06のインストーラーが起動しない 1 2023/03/27 21:58
- Java mac mini 2009 でのmac OS における Java の入れ替えについて 1 2022/12/27 19:23
- Java java final 1 2022/06/10 22:49
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
三つの文字を順に並べるプログラム
-
equalsの逆
-
「テキストファイルをリソース...
-
Java FileDialog に関して
-
eclipseに記述したjavaファイル...
-
C# 半角カナの文字化けについて
-
【JAVAエラー】互換性のない型...
-
Javaで文字と数字が混ざったも...
-
ハートマークを表示するには?
-
0~9まで入力させ、前に入力さ...
-
System.out.printlnの出力先
-
配列への文字列の格納について
-
C言語のポインターに関する警告
-
JSPでDBからデータ読み込みブラ...
-
パソコンキーボードで時分秒を...
-
nullcline
-
エクセルの配列定数について教...
-
JAVAで素数判定
-
メンバ関数のconst
-
演算子について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
equalsの逆
-
InputStream.read()でタイムア...
-
Java int sum = 0は必要ですか?
-
テキストファイルから空白行をよむ
-
csv出力について
-
[JAVA]エラーが解決できません。
-
Javaの質問です。テキストファ...
-
Servletでテキストボックスに入...
-
Javaでデータに登録する度にID...
-
ソケットを使ったサーバとクラ...
-
javaのfor文が機能してないみた...
-
java連結
-
九九を横に表示する。
-
Class.forNameでエラーになる
-
テキストファイルにおいて任意...
-
ObjectInputStreamとStreamCorr...
-
Javaの質問です。テキストファ...
-
javaでCSVの中身から最大値を表...
-
BufferedReaderでのエラー
おすすめ情報