0

对于 Java 家庭作业,我需要创建一个读写 CSV 文件的类。我目前在阅读 CSV 时遇到一些问题。下面的代码只输出代码的第一行,然后生成以下错误消息:'Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 at com.gc01.FileManager.CSVManager.main(CSVManager.java:27 )”。

我查看了各种示例,并且知道“opencsv”包,但我需要自己编写这段代码。我已将问题定位到语句“System.out.print(data[i]);”。但是,当交叉引用此代码时,一切似乎都很好。

我正在使用我的老师(http://www.devjavasoft.org/SecondEdition/SourceCode/Share/FileInput.java)指定的 FileInput 类中的方法。

public class CSVManager {
    public static void main(String [] args){

        Scanner sc = new Scanner (System.in);
        System.out.println("Please enter the file directory of the chosen CSV");
        System.out.println("For Example: /Users/UserName/Downloads/FileName.csv");
        ///Users/ReeceAkhtar/Desktop/GeoIPCountryWhois.csv
        final String fileName = sc.nextLine();
        System.out.println("How many columns?");
        final int columns = sc.nextInt();

        BufferedReader br = null;
        String line = "";
        String splitBy = " , ";

        try {
            br = new BufferedReader(new FileReader(fileName));
            while((line = br.readLine()) != null) {
                for (int i = 0; i < columns; i++) {
                    String[] data = line.split(splitBy);
                    System.out.print(data[i]);
                }
            }
        } catch (FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {   
            e.printStackTrace();  
        } finally {  
            if (br != null) {  
            try {  
                    br.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }
            }
        }
        System.out.println("File Read");
    }
}
4

3 回答 3

1

异常非常明确

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 

意味着,您正在尝试访问数组中不存在的第一个元素

既然你说System.out.print(data[i]);的是发生异常的行,那么第一行 data必须只填充单个元素

使用 IDE 调试问题以找出 split 方法导致意外元素的原因。我怀疑使用周围的空间,是原因" , "

于 2013-10-25T10:48:25.587 回答
1

试试这个。如果您拆分 for 循环,一切都会好起来的。

String[] data = line.split(splitBy);
while((line = br.readLine()) != null){
    for (int i = 0; i < columns; i++){
        System.out.print(data[i]);
    }
}
于 2013-10-25T10:48:28.387 回答
0
 while((line = br.readLine()) != null){
    for (int i = 0; i < columns; i++){
    String[] data = line.split(splitBy);
    System.out.print(data[i]);
    }
  1. 您在循环内多次拆分一行,for没有任何理由。
  2. 您正在使用" , "用于拆分(这可能是您遇到ArrayIndexOfBound异常的原因)而不是使用","; 如果您愿意,可以使用trim()ondata[i]去除尾随/前导空格。
  3. 拆分后,检查data.length是否相等以columns保持一致性。
  4. 我们现在处于 JDK 7 的时代,我们可以使用try-with-resourcewhich close 在try(){}上下文中声明的资源,让我们摆脱finally阻塞

所以你的可能应该如下所示:

  try (BufferedReader br = new BufferedReader(new FileReader(fileName))){
     while((line = br.readLine()) != null){
        String[] data = line.split(splitBy);

        if(data.length != columns)continue; // check for consistency, 
                                       //might throw an exception 

        for (int i = 0; i < columns; i++){
          System.out.print(data[i].trim());
        }

  }catch(IoExection ex)
  {
     ex.printStackTrace();  
  }
于 2013-10-25T11:11:10.833 回答