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

读取工资文件触发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:43:42