Java NetBeans:为什么我的字符串数组过早终止?

时间:2014-02-15 19:46:38

标签: java arrays csv netbeans

我发现了问题。显然,csv文件中的某些名称中存在随机空格,这导致第257个条目中断,以及之后的其他几个条目。所以,我刚拿出空间,现在一切正常。感谢所有试图提供帮助的人。

我有这个代码从csv文件中读取,将值放在String数组中,并打印出来供我查看。它运行正常,直到它到达数组的第257个成员(每个成员有3个值:姓氏,名字和出生年份)。这是代码的功能版本:

package testing.csv.files;


import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class Test {

public static void main(String[] args) {
    //.csv comma separated values
    String fileName = "C:/Users/Owner/Desktop/Data.csv";
    File file = new File(fileName); // TODO: read about File Names
    try {
        Scanner inputStream = new Scanner(file);
        inputStream.next(); //Ignore first line of titles
        while (inputStream.hasNext()){
            String data = inputStream.next(); // gets a whole line
            String[] values = data.split(",");
            System.out.println(data);
        }
        inputStream.close();

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

}

现在,当我更改行

 System.out.println(data);

对此:

 System.out.println(values[2]);

我期望发生的事情是,只为阵列中的每个人打印出生年份(第3列)。但是,它只打印到第257个人的出生年份(超过18,000),并给我以下错误信息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at testing.csv.files.Test.main(Test.java:22)
 Java Result: 1
 BUILD SUCCESSFUL (total time: 0 seconds)

“java:22”似乎是指我上面发布的上述代码片段,我改变了。我不确定问题是什么。如果我的语法错误,为什么要打印?我唯一能想到的是,字符串数组可能只能处理257个不同的人,每个人都有自己的3个值。如果是这种情况,那么我需要某种更大版本的字符串来保存我的所有数据。以前有人遇到过这个问题吗?问题出在我的语法和循环中吗?

3 个答案:

答案 0 :(得分:0)

如果values数组中只有两件事,那么您可以索引的最高位置是1

对于数组,您只能索引size - 1个点;也就是说,如果您的数组大小为10,则可以索引到位置9或更详细:array[9]

将索引语句更改为:

System.out.println(values[1]);

答案 1 :(得分:0)

更改:

String data = inputStream.next(); // next()只能读取输入直到空格

到:

String data = inputStream.nextLine(); // nextLine()读取包含单词之间空格的输入

更好的方法是迭代数组而不是通过索引访问可能是csv中不包含第三列的特定行。

答案 2 :(得分:0)

您可能希望在csv文件中看到第257条记录。 split方法会为它创建三个令牌吗?如果它应该导致少于三个令牌,并且您尝试通过键入

来打印第三个令牌
System.out.println(values[2]); 

你会得到一个ArrayIndexOutOfBoundsException。