File fil = new File("Tall.txt");
FileReader inputFil = new FileReader(fil);
BufferedReader in = new BufferedReader(inputFil);
int [] tall = new int [100];
String s =in.readLine();
while(s!=null)
{
int i = 0;
tall[i] = Integer.parseInt(s); //this is line 19
System.out.println(tall[i]);
s = in.readLine();
}
in.close();
"Tall.txt" というファイルを使って、その中に含まれる整数を "tall" という名前の配列に書き込もうとしています。ある程度はできているのですが、また、実行すると以下のような例外が発生します(:
Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at BinarySok.main(BinarySok.java:19)
なぜこのようなことができるのでしょうか。また、どのようにすればこれを取り除くことができるのでしょうか。私の見るところ、ファイルを文字列として読み、それをintsに変換しているのですが、これは違法ではありません。
ファイル内に空行があることが必要です。
parseIntの呼び出しは、"try"ブロックで囲むとよいかもしれません:
try {
tall[i++] = Integer.parseInt(s);
}
catch (NumberFormatException ex) {
continue;
}
または、パースする前に単純に空文字列をチェックします:
if (s.length() == 0)
continue;
ループの中でインデックス変数 i
を初期化することで、常に0になることに注意してください。この宣言は、while
ループの前に移動させる必要があります。(あるいは、for
ループの一部にする)。
比較のために、ファイルを読む別の方法を次に示します。 ファイルに整数がいくつあるかを知る必要がないという利点が1つあります。
File file = new File("Tall.txt");
byte[] bytes = new byte[(int) file.length()];
FileInputStream fis = new FileInputStream(file);
fis.read(bytes);
fis.close();
String[] valueStr = new String(bytes).trim().split("\\s+");
int[] tall = new int[valueStr.length];
for (int i = 0; i < valueStr.length; i++)
tall[i] = Integer.parseInt(valueStr[i]);
System.out.println(Arrays.asList(tall));
Javaが空の文字列を数値に変換しようとしているように見えます。一連の数値の末尾に空行がありませんか?
おそらく、次のようにコードを修正することができます。
String s = in.readLine();
int i = 0;
while (s != null) {
// Skip empty lines.
s = s.trim();
if (s.length() == 0) {
continue;
}
tall[i] = Integer.parseInt(s); // This is line 19.
System.out.println(tall[i]);
s = in.readLine();
i++;
}
in.close();
File file = new File("E:/Responsibility.txt");
Scanner scanner = new Scanner(file);
List<Integer> integers = new ArrayList<>();
while (scanner.hasNext()) {
if (scanner.hasNextInt()) {
integers.add(scanner.nextInt());
} else {
scanner.next();
}
}
System.out.println(integers);