Java使用Scanner读取员工信息文本文件时出现跳行并抛出NoSuchElementException异常的问题
问题分析与修复方案
嘿,我一眼就看出问题出在哪了——你在循环里连续调用了两次sc.nextLine()!
咱们来理一理流程:每次while(sc.hasNextLine())判断有下一行时,你先调用sc.nextLine()打印一行,紧接着又调用一次sc.nextLine()把内容赋值给s。这就意味着,每次循环你其实读了两行数据:一行用来打印,一行用来解析成Employee对象。所以你看到打印的是1、3、5、7这些奇数行,而2、4、6这些偶数行被悄悄拿去解析了。
更糟的是,当文件读到最后一行(第7行)时,hasNextLine()判断还有行,于是进入循环:先打印第7行,然后你又尝试调用sc.nextLine(),但这时候已经没有更多行可读了,直接触发了NoSuchElementException。
修复后的代码
只需要把行读取操作合并成一次,用同一个变量来处理打印和解析:
import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class EmployeeDetails { public static void main(String[] args) throws IOException { // 加上泛型,让代码类型更安全 List<Employee> empList1 = new ArrayList<>(); File f = new File("Employee.txt"); Scanner sc = new Scanner(f); while(sc.hasNextLine()) { String s = sc.nextLine(); // 只读取一次当前行 System.out.println(s); // 打印这一行 String[] sr = s.trim().split(","); Employee emp1 = new Employee(Integer.parseInt(sr[0]), sr[1], Long.parseLong(sr[2])); empList1.add(emp1); } sc.close(); System.out.println(empList1); } }
额外优化建议
如果你的文件里可能存在空行,可以在读取后先判断并跳过,避免解析空字符串时报错:
while(sc.hasNextLine()) { String s = sc.nextLine().trim(); if(s.isEmpty()) { continue; // 跳过空行 } System.out.println(s); String[] sr = s.split(","); Employee emp1 = new Employee(Integer.parseInt(sr[0]), sr[1], Long.parseLong(sr[2])); empList1.add(emp1); }
这样修改后,就能正常读取每一行并解析成Employee对象,也不会再抛出异常啦。
内容的提问来源于stack exchange,提问作者Prakash
相关产品推荐
相关产品推荐

