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。当只使用一个数组时,该程序可以工作。有谁知道它为什么抛出这个异常以及如何解决它?
答案 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)
其中一个帐号没有余额,或者是空白,或者还有一个额外的逗号...