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

Java读取员工文件程序在while循环处冻结,求排查解决方法

问题分析与修复方案

导致程序冻结的直接原因

你的while循环条件后面多了一个分号:

while (inputFile.hasNext()); {

这个分号会让while的循环体变成一个空语句(;本身就是空语句),程序会无限执行这个空循环——只要inputFile.hasNext()返回true,就一直循环什么都不做,自然会出现“冻结”的现象。

额外的潜在问题

除了分号的问题,你的读取逻辑还有Scanner使用的不匹配问题:

  • hasNext()判断的是是否存在下一个空白分隔的token,但你用nextLine()读取整行,两者的判断逻辑不匹配
  • 使用nextDouble()后,Scanner的指针会停在数字后面的换行符处,下一次nextLine()会读取到空行,导致数据读取错位

修正后的代码示例

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class EmployeeEmailGenerator {
    public static void main(String[] args) throws IOException {
        File file = new File("employeeInput.txt");

        if (file.exists()) {
            // 使用try-with-resources自动关闭Scanner,避免资源泄漏
            try (Scanner inputFile = new Scanner(file)) {
                String companyName = inputFile.nextLine();
                System.out.println(companyName);
                System.out.println();
                System.out.println("----------------------------");

                // 改用hasNextLine()判断是否还有行可读,同时去掉多余的分号
                while (inputFile.hasNextLine()) {
                    // 读取员工ID
                    String employeeID = inputFile.nextLine();
                    // 读取姓名
                    String employeeName = inputFile.nextLine();
                    // 读取级别
                    String employeeLevel = inputFile.nextLine();
                    // 读取薪资:先读行再转换为double,避免换行符残留问题
                    String salaryStr = inputFile.nextLine();
                    double salary = Double.parseDouble(salaryStr);

                    // 这里可以添加生成邮箱的逻辑,比如:
                    // String email = employeeID.toLowerCase() + "@" + companyName.toLowerCase().replace(" ", "") + ".com";
                    // System.out.println("邮箱:" + email);

                    // 输出读取到的测试数据
                    System.out.println("ID: " + employeeID);
                    System.out.println("姓名: " + employeeName);
                    System.out.println("级别: " + employeeLevel);
                    System.out.println("薪资: " + salary);
                    System.out.println("----------------------------");
                }
            } // Scanner会在这里自动关闭
        } else {
            System.out.println("The file employeeInput.txt does not exist");
        }
    }
}

关键修复点说明

  1. 移除while循环后的分号:让大括号里的代码成为真正的循环体
  2. 替换hasNext()为hasNextLine():因为你的数据是每行一个字段,用行判断更准确
  3. 统一用nextLine()读取所有内容:读取薪资时先读整行再转换为double,避免nextDouble()留下的换行符导致后续nextLine()读取空行的问题
  4. 使用try-with-resources:自动管理Scanner资源,不用手动调用close(),也能避免异常时资源泄漏

后续建议

  • 测试时确保employeeInput.txt的格式正确:第一行是公司名,之后每4行对应一个员工的ID、姓名、级别、薪资
  • 生成邮箱时可以对姓名/ID做格式化处理(比如转小写、去掉空格等)
  • 可以添加异常处理(比如薪资无法转换为double时的捕获),让程序更健壮

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:30:52