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"); } } }
关键修复点说明
- 移除while循环后的分号:让大括号里的代码成为真正的循环体
- 替换
hasNext()为hasNextLine():因为你的数据是每行一个字段,用行判断更准确 - 统一用
nextLine()读取所有内容:读取薪资时先读整行再转换为double,避免nextDouble()留下的换行符导致后续nextLine()读取空行的问题 - 使用try-with-resources:自动管理Scanner资源,不用手动调用
close(),也能避免异常时资源泄漏
后续建议
- 测试时确保
employeeInput.txt的格式正确:第一行是公司名,之后每4行对应一个员工的ID、姓名、级别、薪资 - 生成邮箱时可以对姓名/ID做格式化处理(比如转小写、去掉空格等)
- 可以添加异常处理(比如薪资无法转换为double时的捕获),让程序更健壮
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

