带有两个ArrayLists的NoSuchElementException

时间:2013-05-01 17:12:07

标签: java csv arraylist java.util.scanner nosuchelementexception

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

public class CSVReader
{
public static void main(String[] args) throws FileNotFoundException
{
    Scanner scanner = new Scanner(new File("Lunch.csv"));
    ArrayList<String> AccountNum = new ArrayList<String>();
    ArrayList<String> AccountBal = new ArrayList<String>();
    scanner.useDelimiter(",");
    while(scanner.hasNext())
    {
       AccountNum.add(scanner.next());
       AccountBal.add(scanner.next());
    }
    scanner.close();
    display(AccountNum, AccountBal);
 }

 public static void display(ArrayList AccountNum, ArrayList AccountBal)
 {
     System.out.println("\nThe size of the list is " + AccountNum.size());
     for(int x = 0; x < AccountNum.size(); ++x)
     {
        System.out.println("position " + x + " Number: " + AccountNum.get(x));
        System.out.println("position " + x + " Number: " + AccountBal.get(x));
     }
 }


}

该程序应该从CSV文件读取到两个数组。它编译得很好,但是当我运行它时会抛出NoSuchElementException。当只使用一个数组时,该程序可以工作。有谁知道它为什么抛出这个异常以及如何解决它?

3 个答案:

答案 0 :(得分:4)

编辑:要更正我对ChrisCM评论的回答,这将阻止您在仍然交替扫描仪输入时收到的异常。

while(scanner.hasNext())
{
   AccountNum.add(scanner.next());
   if(scanner.hasNext())
       AccountBal.add(scanner.next());
}

您可能会发现最终会出现不均匀的列表(AccountNum的最后一个元素将是空格),您可以使用

来解决此问题。
if(AccountNum.get(AccountNum.size() - 1).trim().equals("")) {
    AccountNum.remove(AccountNum.size() - 1);
}

如果您仍然有不均匀的列表,那么您需要调试程序以找出问题。

解析输入的另一种方法:

while(scanner.hasNext())
{
   String temp = scanner.next();
   if(temp.trim().equals("") && scanner.hasNext()) {
       throw new Exception("This shouldn't happen");
   } else { 
       AccountNum.add(temp);
   }
   if(scanner.hasNext())
       AccountBal.add(scanner.next());
}

您还可以切换到使用像opencsv这样的库,它可以处理输入文件中的空白区域。

答案 1 :(得分:1)

输入文件中可能有奇数项目。您的代码假设每个帐号都有一个,只有一个余额。如果您的文件确实符合此要求,则可能是您使用:

scanner.useDelimeter(",");

您可能希望成为

scanner.useDelimiter(",|\\n");

答案 2 :(得分:1)

其中一个帐号没有余额,或者是空白,或者还有一个额外的逗号...