【问题标题】:Java NetBeans: Why does my string array terminate prematurely?Java NetBeans:为什么我的字符串数组过早终止?
【发布时间】:2014-02-15 19:46:38
【问题描述】:

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

我有这个从 csv 文件读取的代码,将值放入字符串数组中,然后打印出来供我查看。它运行良好,直到到达数组的第 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”似乎是指我在上面发布的代码的上述 sn-p 代码,我已更改。我不确定问题是什么。如果我的语法错误,为什么它会打印出来?我唯一能想到的是,也许一个字符串数组只能处理 257 个不同的人,每个人都有自己的 3 个值。如果是这种情况,那么我需要某种更大版本的字符串来保存我的所有数据。有没有人遇到过这个问题?问题出在我的语法和循环中吗?

【问题讨论】:

  • 您正在调用 inputStream.next() 并且您的评论说 //gets 整行。如果这是真的,那只是因为纯粹的机会。您应该使用 inputStream.nextLine() 来获取文件的下一行

标签: java arrays csv netbeans


【解决方案1】:

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

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

将您的索引语句更改为:

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

【讨论】:

  • 如果您仔细阅读我写的内容,您会发现数组的每个成员都有 3 个值,所以我已经按照您的建议进行了操作。如果您有其他想法,请告诉我。
  • 不根据拆分和ArrayIndexOutOfBoundException。我会通过打印values 的大小来验证你有多少元素。
【解决方案2】:

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

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

你会得到一个 ArrayIndexOutOfBoundsException。

【讨论】:

    【解决方案3】:

    变化:

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

    到:

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

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

    【讨论】:

    • 我试过这个,但现在没有打印任何值,我收到错误消息:线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 2 at testing.csv.files.Test。 main(Test.java:22) Java 结果:1 BUILD SUCCESSFUL(总时间:0 秒)
    • 你能在出现问题的地方粘贴 csv 行吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多