NoSuchElementException

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。仅使用一个数组时,该程序即可运行。有谁知道为什么会抛出该异常以及如何解决它?

最佳答案

编辑:要更正我对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之类的库,该库可以处理输入文件中的空白伪造。

关于java - NoSuchElementException与两个ArrayLists,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16322935/

10-10 23:33