0

私のコードは次のとおりです。

public static void main(String args[]) throws IOException
{
    String name;
    int population;
    String[] tokens;
    FileReader fin = new FileReader("Test.txt");

    Scanner src = new Scanner(fin);

    src.useDelimiter(",");

    while (src.hasNextLine())
    {
        if (src.hasNext())
        {
            tokens = src.nextLine().split(",\\s");
            name = tokens[0];
            population = Integer.parseInt(tokens[1].trim());
            System.out.printf("Name:%-15s  %-15d\n", name, population);
        } else
        {
            String str = src.next();
            if (str.equals(""))
            {
                break;
            } else
            {
                System.out.println("File format error.");
                return;
            }
        }
    }
    System.out.println("end");
    fin.close();
}

私のテスト ファイルでは、州名の後にコンマ、スペース、人口、そしておそらく人口の後にランダムなスペースが続くだけです。私の出力結果は

..... 名前:バージニア 7100702
名前:ワシントン 5908684
名前:ウェスト バージニア 1813077
名前:ウィスコンシン 5371210
名前:ワイオミング 495304
スレッド「メイン」での例外 java.lang.ArrayIndexOutOfBoundsException: 1 at javatesters.JavaTesters.main(JavaTesters.java: 35) Java 結果: 1 ビルド成功 (合計時間: 0 秒)

私のテストファイルの終わりは

バージニア 7100702
ワシントン 5908684
ウェストバージニア 1813077
ウィスコンシン 5371210
ワイオミング 495304

総配分人口 281424177 435

そして、空白行でファイルの終わりを示したい

4

1 に答える 1

0

スキャナーが「,」を含まない行に到達すると、そのsplit(",\\s")呼び出しはそれを 1 つの文字列に分割します。したがって、 にアクセスするtokens[1]と、配列の範囲外になります。これを回避する方法はたくさんあります。tokens1 つのアプローチ (最もクリーンではありませんが) は、使用する前に 2 つの要素があることを確認することです。

于 2012-03-17T22:03:47.343 に答える