2016-08-31 65 views
0
public static ArrayList<Student> readStudentRecords(String fileName) throws FileNotFoundException { 
    Scanner input = new Scanner(new FileInputStream(fileName)); 
    ArrayList<Student> students = new ArrayList<Student>(); 
    input.useDelimiter(","); 
    String firstName, lastName, id, email, hashPW; 
    int maxCredits = 0; 
    while (input.hasNextLine()) { 
     try { 
      input.nextLine(); 
      firstName = input.next(); 
      lastName = input.next(); 
      id = input.next(); 
      email = input.next(); 
      hashPW = input.next(); 
      maxCredits = input.nextInt(); 
      Student student = new Student(firstName, lastName, id, email, hashPW, maxCredits); 
      students.add(student); 
     } catch (IllegalArgumentException e) { 
      System.out.println("Illegal Argument Exception"); 
      input.next(); 
     } catch (NoSuchElementException e) { 
      System.out.println("No Such Element Exception"); 
      input.next(); 
     } 
    } 
    input.close(); 
    return students; 
}  

我創建一個程序,讀取一個列出學生姓,名,ID,電子郵件,哈希密碼,和最大學分的文本文件。文本文件的每一行都有一整套由逗號分隔的元素。我希望程序讀取該文件,創建從每個線(我已經創建並測試了學生類,包括所有的getter和setter)學生對象,並安排在一個數組列表中的學生對象。該計劃得到循環在NoSuchElementException異常,僅讀取文本文件的第一行,並忽略接下來的9,我不知道確切格式我try-catch語句應該是,以確保它不會無限循環。嘗試捕獲而陷入上沒有這樣的元素異常循環

+0

看起來你正在處理一個CSV文件,所以你應該使用CSV閱讀器庫 –

回答

0

try塊中的第一行顯示可用的線,然後拋出它扔掉:

while (input.hasNextLine()) { 
    try { 
     input.nextLine(); 
     ... 

您得到異常的原因是,你扔掉剛剛籤行在那裏,然後繼續嘗試從input閱讀,無論是否有你剛剛搗毀了行之後增加任何

你應該做的其中之一:

  1. 捕獲該行並對其進行分析(而不是調用下面幾行input.next()input.nextInt());或
  2. 消除呼叫input.nextLine()並希望各線正常符合你期望的佈局;或
  3. 通過調用一個CSV文件解析工具替換整個while環路(如@Scary袋熊建議在評論)。
0

Scanner你需要檢查是否存在與hasNextLine() 如此循環將成爲

while(sc.hasNextLine()){ 
    str=sc.nextline(); 
//... 
} 

這個代碼這取決於輸入是否正確格式化的下一行

你打電話nextLine()和它拋出一個異常時,有沒有線,完全一樣的Javadoc描述。它永遠不會返回null

0

其他的答案看起來我的權利。只需添加一些尚未說明的內容:

  1. 捕獲異常時,確保不要吞下它(即忽略它),只需輸出該信息即可。如果有的話,你會丟失e.printStackTrace()會暴露的信息,那就是告訴你它到底在哪一行發生故障。
  2. ,你有實際的錯誤是因爲掃描儀使用,作爲分隔符,所以這意味着最後一個值會像10\n(如果10是一排最大學分)。您可以通過執行如下操作來解決此問題:String[] words = scanner.nextLine().split(",");,而不是使用掃描儀逐字處理它。