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 ...