14
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)

なぜ正確にこれを行うのですか?どうすれば削除できますか? ご覧のとおり、ファイルを文字列として読み取り、それを int に変換しますが、これは違法ではありません。

4

6 に答える 6

44

あなたはこのようなことをしたいかもしれません(あなたがJava5以上を使っているなら)

Scanner scanner = new Scanner(new File("tall.txt"));
int [] tall = new int [100];
int i = 0;
while(scanner.hasNextInt()){
   tall[i++] = scanner.nextInt();
}
于 2008-11-20T01:21:48.097 に答える
9

ファイルには空の行が必要です。

parseInt 呼び出しを「try」ブロックでラップすることができます。

try {
  tall[i++] = Integer.parseInt(s);
}
catch (NumberFormatException ex) {
  continue;
}

または、解析する前に空の文字列をチェックするだけです:

if (s.length() == 0) 
  continue;

iループ内でインデックス変数を初期化すると、常に 0 になることに注意してwhileください。ループの前に宣言を移動する必要があります。(または、forループの一部にします。)

于 2008-11-20T00:10:12.687 に答える
3

比較のために、ファイルを読み取る別の方法を次に示します。ファイルに含まれる整数の数を知る必要がないという利点があります。

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));
于 2009-04-27T20:24:44.413 に答える
2

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();
于 2008-11-20T00:14:27.310 に答える
1

異なる行末の間で混乱が生じる可能性があります。Windows ファイルは、キャリッジ リターンとライン フィードで各行を終了します。Unix の一部のプログラムは、改行を行末と見なし、改行を別の行末と見なすため、各行の間に余分な空白行があるかのようにそのファイルを読み取ります。

于 2008-11-20T00:15:36.967 に答える