2

这让我彻底疯了!我已经做了一些错误测试,我现在真的不知道如何进行。

我正在从文本文件中读取数据,使用 String.split(",") 方法(我使用逗号)拆分行,并对数据进行处理。我遇到了麻烦...我收到了 ArrayIndexOutOfBoundsException。

这是我文件的前两行:

1,,1,Male Slave,,1,1,
2,yes,1,Bronze Cooking Pot,,,,

我的代码:

        try {       
        File file = new File("/Accounts/changy/Desktop/GreekProject/data.txt");
        Scanner sc = new Scanner(file);
        sc.nextLine(); 
        while (sc.hasNextLine()) {
            String line = sc.nextLine();
            String[] splitArray = line.split(",{1}");
            System.out.println(splitArray.length);
            System.out.println(splitArray[0] + "\t" + splitArray[1] + "\t" + splitArray[2]+ "\t" + splitArray[3]+ "\t" + splitArray[4]);
        }
    }        
    catch (NullPointerException e) {
        System.out.println("NPE!!");
    }
    catch (FileNotFoundException e) {
        System.out.println("FNFE!!");
    }
    catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("AIOOBE!!")
    }

所以如果我省略 splitArray[4],代码运行得非常好。我什至尝试在行尾添加额外的逗号,但这无济于事。数组的长度是 7,所以对我来说第五个条目是空的真的没有意义......任何帮助将不胜感激。

4

2 回答 2

3

String.split默默地丢弃尾随分隔符。(这是其众多问题之一。)IIRC,您应该使用line.split(",{1}", -1);.

于 2013-08-13T21:45:18.073 回答
3

只有一个参数的方法版本split将在返回给您之前将数组末尾的所有空标记字符串修剪掉,因此第二行将产生一个长度仅为 4 的数组。

使用带负数的 , 的两个参数版本splitlimit,这样它就不会从数组中删除尾随的空字符串,并且所有预期的元素都会在那里。

String[] splitArray = line.split(",{1}", -1);

引用链接的 Javadocs:

如果 n 为非正数,则该模式将尽可能多地应用,并且数组可以具有任意长度。如果 n 为零,则该模式将被应用尽可能多的次数,数组可以有任意长度,并且尾随的空字符串将被丢弃。

在这里,当它们引用 时n,它们实际上是在引用limit(第二个参数)。

于 2013-08-13T21:45:48.857 回答