1

1 桁の整数の文字列を ArrayList に変換したかったのIntegerですが、非常に奇妙な例外が発生しました。サンプルコードは次のとおりです。

    Scanner test = new Scanner(System.in);
    String[] temp = null;
    String line = null;
    ArrayList<Integer> artemp = new ArrayList<>();

    while(test.hasNext()) {
        line = test.next();
        temp = line.split("");
        for(int i = 0; i < temp.length; i++)
        artemp.add(Integer.parseInt(temp[i]));
        for(int i : artemp) System.out.println(i);

    }

基本的には、stdin から int の文字列を読み取り、プリミティブとして配列リストに入れ、出力することになっています。もちろん、これは大きなエラーを絞り込んだ小さなテスト ケースにすぎません。

これにより発生する例外は次のとおりです。

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:504)
    at java.lang.Integer.parseInt(Integer.java:527)

私が見る限り、次のことが起こるはずです:

  1. linestdin を受け取る
  2. temp個々の 1 桁の値が入力されます (split("") は各文字の後に分割されます)。
  3. 各数字 ( として格納String) は として解析され、intに追加されます。artemp
  4. 各桁を印刷します。

ここで何がうまくいかないのですか?temp次のコードで印刷すると:

for(String s : temp) System.out.println(s);

その後、数字は (文字列として) 正常に出力され、余分な文字はありません。どのくらい正確parseInt(temp[i])に文字列に適用できます""か?

4

4 に答える 4

0

まず第一に、私はあなたの分裂を疑っています.

  temp = line.split("");

スペースで分割したい場合は、

  temp = line.split(" ");

そして、あなたが望む""なら、ここに原因があります。

変換とは何の関係もありません。

あなたの中にはいくつかの空の文字列がありますarray

そのため、空の文字列を整数に変換する際に例外が発生しました。

ここ

 artemp.add(Integer.parseInt(temp[i]));

できることは、解析する前にデータをチェックすることです。

if(temp[i]!=null && !temp[i].isEmpty()){
          artemp.add(Integer.parseInt(temp[i]));
}
于 2013-09-23T05:45:15.557 に答える
0

ドキュメントからparseInt

Throws:
    NumberFormatException - if the string does not contain a parsable integer.

したがって、コードartemp.add(Integer.parseInt(temp[i]));は解析不能な文字列に遭遇する場所です。

于 2013-09-23T05:49:08.297 に答える