读取工资文件触发InputMismatchException,Java工资计算程序排障求助
解决Java读取工资文件时的InputMismatchException问题
首先,咱们先定位问题根源:你遇到的InputMismatchException,基本是因为Scanner读取数据时的类型不匹配,结合你的代码和需求来看,主要有这几个坑:
1. 没跳过文件的表头行
你的wages.txt包含表头,但代码里直接开始读取数据,第一次读出来的是表头字符串(比如"First Name"这类),后续读取时薪(double)和工时(int)时,会把表头的非数字内容当成数字读取,直接触发类型不匹配异常。
2. Scanner的分隔符设置有问题
你写的in_file.useDelimiter("[,\n]\\s");正则表达式不够灵活:[,\n]匹配逗号或换行,\\s只匹配单个空格,但如果文件里逗号后有多个空格、换行后有空格,就会匹配失败,导致读取的内容串位,类型自然不匹配。
3. 缺少工资计算逻辑&数据读取顺序需要明确
你提到要计算带加班费率的净工资,但原代码里没这部分逻辑;同时要严格对应文件里的字段顺序(名、姓、时薪、工时)来读取,否则也会导致类型错误。
修正后的完整代码片段
我把这些问题都修复了,你可以参考:
import java.io.File; import java.io.FileNotFoundException; import java.util.InputMismatchException; import java.util.Scanner; import java.io.PrintWriter; public class WageCalculator { static void wages() { // 输入输出文件路径 String inputFileName = "wages.txt"; String outputFileName = "out.txt"; File inputFile = new File(inputFileName); File outputFile = new File(outputFileName); Scanner inFile = null; PrintWriter outFile = null; String outFormatLine = "Last Name, First Name, Total Amount"; // 初始化输出文件并写入格式行 try { outFile = new PrintWriter(outputFile); outFile.println(outFormatLine); } catch (FileNotFoundException ex) { System.out.println("错误:无法创建/打开输出文件"); ex.printStackTrace(); System.exit(0); } // 初始化输入文件并配置分隔符 try { inFile = new Scanner(inputFile); // 修正分隔符:匹配逗号+任意空格,或者换行+任意空格 inFile.useDelimiter(",\\s*|\\n\\s*"); // 跳过表头行 inFile.nextLine(); } catch (FileNotFoundException ex) { System.out.println("错误:输入文件不存在"); ex.printStackTrace(); System.exit(0); } // 读取并处理每一行数据 try { while (inFile.hasNext()) { // 严格按照文件顺序读取:名、姓、时薪、工时 String firstName = inFile.next(); String lastName = inFile.next(); double hourlyRate = inFile.nextDouble(); int hoursWorked = inFile.nextInt(); // 计算总工资:加班费率为基础时薪的一半,即加班时薪为1.5倍基础时薪 double totalWage; if (hoursWorked <= 40) { totalWage = hourlyRate * hoursWorked; } else { // 正常40小时工资 + 加班部分工资 totalWage = (hourlyRate * 40) + ((hoursWorked - 40) * hourlyRate * 1.5); } // 按要求格式写入输出文件:姓、名、总工资(保留两位小数) outFile.printf("%s, %s, %.2f%n", lastName, firstName, totalWage); } } catch (InputMismatchException ex) { System.out.println("错误:文件数据格式不匹配,请检查每行数据的类型是否正确"); ex.printStackTrace(); } finally { // 确保资源正确关闭 if (inFile != null) inFile.close(); if (outFile != null) outFile.close(); } } public static void main(String[] args) { wages(); } }
关键修改点说明
- 跳过表头:用
inFile.nextLine()直接跳过第一行表头,避免读取表头内容导致类型错误。 - 灵活分隔符:
",\\s*|\\n\\s*"可以匹配逗号后任意数量的空格(包括0个)、换行后任意数量的空格,确保每个字段都能被正确分割。 - 完善异常处理:在读取数据时捕获
InputMismatchException,方便排查哪一行数据格式有问题。 - 补全工资计算:按照你的需求实现了加班工资逻辑,并用
printf保证总工资输出格式规范(保留两位小数)。 - 资源管理:用
finally块确保输入输出流都被正确关闭,避免资源泄漏。
内容的提问来源于stack exchange,提问作者M. Dingus
相关产品推荐
相关产品推荐

