You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 20:27:29