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

Java Transaction类FileWriter报FileNotFoundException及金额校验异常求助

问题修复说明

异常1:满足校验仍弹出「Amount Cannot Be 0 or Negative」提示

  • 错误位置:getAmount()方法中的条件判断代码,以及所有pname != ""的字符串判空逻辑
  • 错误原因:
    1. Java中==/!=用于字符串比较时,判断的是对象的内存地址而非内容,哪怕pname有实际值,只要不是指向常量池中的空字符串对象,pname != ""的判断结果就为false,触发else分支的报错提示
    2. 额外隐患:amt为float类型,但代码中用Integer.parseInt()转换输入的金额,用户输入带小数的金额时会直接触发格式转换异常
  • 修复方法:
    1. 把所有pname != ""的判断替换为!pname.isBlank(),既可以正确判断字符串内容非空,还能过滤全是空格的无效输入
    2. 把Integer.parseInt(baseCostTextField.getText().trim())替换为Float.parseFloat(baseCostTextField.getText().trim()),适配小数金额输入

修复后的getAmount()关键代码示例:

public float getAmount() {
    try {
        // 替换为Float.parseFloat适配小数
        amt = Float.parseFloat(baseCostTextField.getText().trim());
        // 替换字符串比较逻辑
        if (amt > 0 && !pname.isBlank()) {
            amt = (float) (amt + amt * 0.05 + amt * 0.18);
            String a = String.valueOf(amt);
            totalAmtLabel.setText(a);
            totalAmtLabel.setVisible(true);
            flag = 1;
            this.record = "Patient Name: " + pname + "\r\n" + "Patient Age: " + page + "\r\n" + "Speciality Treatment: "
                    + speciality + "\r\n" + "Treatment Category: " + treatment + "\r\n" + "Severitry Rating: " + rating + "\r\n" + "Room Category: " + roomCategory + "\r\n" + "Total Bill Amt: " + amt + "\r\n" + "----------------------------";
            this.filename = pname + "_" + page + ".txt";
        } else {
            JOptionPane.showMessageDialog(null, "Amount Cannot Be 0 or Negative");
        }
    } catch (NumberFormatException e1) {
        JOptionPane.showMessageDialog(this, "Check Details! Enter properly.");
    }
    return amt;
}

异常2:FileWriter抛出FileNotFoundException

  • 错误位置:actionPerformed()方法中生成账单按钮的点击逻辑
  • 错误原因:
    1. 写文件的逻辑没有做前置校验,哪怕getAmount()方法中的校验不通过,filename还保持初始的空字符串值,代码也会尝试调用FileWriter写入空文件名,直接触发异常
    2. 原有逻辑中校验通过后先执行了dispose()销毁窗口,逻辑顺序不合理,应该先完成文件写入再处理页面跳转和销毁
  • 修复方法:
    把写文件的逻辑移到校验通过的代码块内部,确保只有filename和record被正确赋值后才执行写入操作,调整逻辑顺序先写文件再销毁页面

修复后的actionPerformed()关键代码示例:

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == generateBillButton) {
        this.getAmount();
        if (!pname.isBlank() && amt > 0) {
            // 把写文件逻辑移到校验通过的分支内
            try {
                FileWriter writer = new FileWriter(filename, true);
                BufferedWriter bufferedWriter = new BufferedWriter(writer);
                bufferedWriter.write(record);
                bufferedWriter.newLine();
                bufferedWriter.close();
                // 写入成功再弹提示、跳转、销毁页面
                JOptionPane.showMessageDialog(null, "Record Saved with amt: " + amt);
                new HomePage();
                dispose();
            } catch (IOException e2) {
                JOptionPane.showMessageDialog(this, "账单保存失败:" + e2.getMessage());
                e2.printStackTrace();
            }
        }
    }
    if (e.getSource() == clearButton) {
        baseCostTextField.setText("");
        totalAmtLabel.setText("");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:54:06