Java Transaction类FileWriter报FileNotFoundException及金额校验异常求助
问题修复说明
异常1:满足校验仍弹出「Amount Cannot Be 0 or Negative」提示
- 错误位置:
getAmount()方法中的条件判断代码,以及所有pname != ""的字符串判空逻辑 - 错误原因:
- Java中
==/!=用于字符串比较时,判断的是对象的内存地址而非内容,哪怕pname有实际值,只要不是指向常量池中的空字符串对象,pname != ""的判断结果就为false,触发else分支的报错提示 - 额外隐患:
amt为float类型,但代码中用Integer.parseInt()转换输入的金额,用户输入带小数的金额时会直接触发格式转换异常
- Java中
- 修复方法:
- 把所有
pname != ""的判断替换为!pname.isBlank(),既可以正确判断字符串内容非空,还能过滤全是空格的无效输入 - 把
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()方法中生成账单按钮的点击逻辑 - 错误原因:
- 写文件的逻辑没有做前置校验,哪怕
getAmount()方法中的校验不通过,filename还保持初始的空字符串值,代码也会尝试调用FileWriter写入空文件名,直接触发异常 - 原有逻辑中校验通过后先执行了
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
相关产品推荐
相关产品推荐

