0

野球の統計のタブ区切りファイルをスキャンする関数を作成しました。

public static ArrayList dataRead() throws FileNotFoundException {
    //ArrayList array = new ArrayList<ArrayList>();
    Scanner s = new Scanner(new File("c:\\stats.txt")).useDelimiter("\r");

    ArrayList<String> array = new ArrayList<String>();
    int i = 0;
    while(s.next() != null) {
        String currentLine = s.next();
        Scanner split = new Scanner(currentLine).useDelimiter("\t");
        for(int j = 0; j < 16; j++) {
            System.out.print(split.next() + " ");

            j++;

        }
        System.out.println("\r");
    }
    s.close();
    return array;
}

この関数は、ファイルの最後まで機能します。私の知る限り、while ループは null を返すため、ファイルの最後で閉じる必要がありますが、代わりに noSuchElement エラーが発生し続けます。ファイル サイズを保証できれば、そのサイズで for ループを使用するだけですが、チームのサイズは技術的に異なる可能性があるため、それはできません。スキャナーを閉じることができるように、ループ中にファイルスキャナーを適切に終了するにはどうすればよいですか?

4

5 に答える 5

2

scanner.next()ループ条件でuseを使用する代わりに、scanner.hasNext()新しい要素があるかどうかを確認します

于 2012-04-09T04:47:11.157 に答える
2

From: Scanner.next() の Javadoc

例外: NoSuchElementException - 利用可能なトークンがこれ以上ない場合

ファイルに残っている行がなくなると、呼び出しによって例外s.next()がスローされNoSuchElementExceptionます。s.next()また、while() で 1 回、ループ内で 1 回、2 回呼び出しています。あなたは本当にwhile(s.hasNext())代わりに呼ばれるべきです。

于 2012-04-09T04:44:52.623 に答える
0

for ループには 2 つの問題があります。

  1. なぜj < 16ですか?1 行に 16 個未満のトークンがある場合は、エラーになります。split.hasNext()外側の while ループと同様に、条件付きの while ループを使用することを検討してください。

  2. インデックス変数jは 2 回インクリメントされます。1 回は for ループの宣言で、もう 1 回は同じ for ループの本体で行われます。

hasNext()の代わりに使用するには、外側の while ループを修正する必要がありますnext() != null

于 2012-04-09T04:46:09.223 に答える
0

ただ行う:

while(s.hasNext())
{
    //blah
}

また、トークンStringTokenizerには a ではなく aを使用します。for loop

StringTokenizer str = new StringTokenizer(currentLine,"\t");
while(str.hasMoreTokens)
{
    System.out.print(str.nextToken());
}
于 2012-04-09T04:46:11.483 に答える
0

while 条件で s.hasNext() を使用できます。次のトークンが存在する場合は true を返し、それ以外の場合は false を返します。

while(s.hasNext()){
}
于 2012-04-09T04:50:44.357 に答える