1
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异常。该程序仅在使用一个数组时才起作用。有谁知道它为什么抛出这个异常以及如何解决它?带两个ArrayList的NoSuchElementException

+1

您在'scanner.hasNext()'后面使用'scanner.next'两次()' – lifus 2013-05-01 17:13:44

+0

哪一行引发异常,你知道吗?此外,你的while循环似乎假设将会添加偶数个元素。是这样吗?也许从csv和最后一个'AccountBal.add(scanner.next())中有奇数个元素;'问题出在哪里...... – 2013-05-01 17:14:47

回答

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

尽管这不会引发异常,但我怀疑它的功能是否正常他希望它。显然AccountNum和AccountBal不代表相同的信息。 – ChrisCM 2013-05-01 17:17:33

+0

嗯,我的坏 - 我会相应地编辑我的答案 – 2013-05-01 17:19:36

+0

我喜欢这个更好,但是,我仍然不相信它会为他工作。我们需要看看他是如何格式化他的输入文件的! – ChrisCM 2013-05-01 17:33:26

1

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

scanner.useDelimeter(","); 

,你可能想

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

这很好。谢谢。 – user2340242 2013-05-02 16:14:40

+1

然后请接受这个作为答案。注意:Zim-zam的一些错误检查和异常处理仍然是很好的做法!我刚才碰巧犯了这个愚蠢的错误,有点知道这是怎么回事。 – ChrisCM 2013-05-02 16:28:12

1

其中一个账号没有一个平衡的,或者是空白,或者有一个额外的逗号somwhere ...