Java Swing中JOptionPane取消后转BigDecimal报NullPointerException求助
问题原因
- 核心触发点:
JOptionPane.showInputDialog方法在用户点击取消按钮、直接关闭弹窗时返回null,你直接将该null值传入BigDecimal构造方法,直接触发空指针异常 - 次要逻辑错误:你后续的判断逻辑完全无效,
BigDecimal类型的变量不可能和字符串""相等,且判断顺序颠倒,应该先校验输入值再转换为BigDecimal
修复方案
直接替换jButton1ActionPerformed方法的代码即可,修复版代码如下:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // 先接收原始输入字符串,不直接转类型 String inputStr = JOptionPane.showInputDialog(null,"Enter Quantity", 0); // 优先判断用户是否点了取消/输入为空 if (inputStr == null || inputStr.trim().isEmpty()) { JOptionPane.showMessageDialog(null, "Calculation Cancelled"); return; // 终止后续逻辑避免报错 } BigDecimal quantity; try { // 输入合法后再转换为BigDecimal,同时捕获非数字输入的异常 quantity = new BigDecimal(inputStr.trim()); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, "请输入合法的数值!"); return; } // 原有计算逻辑保持不变 DefaultTableModel model1 = (DefaultTableModel) jTable1.getModel(); for (int i = 0; i < model1.getRowCount(); i++) { Object data1 = jTable1.getValueAt(i, 0); Object data2 = jTable1.getValueAt(i, 1); Object data3 = jTable1.getValueAt(i, 2); BigDecimal data4 = new BigDecimal(jTable1.getValueAt(i, 3).toString()); BigDecimal data5 = new BigDecimal(jTable1.getValueAt(i, 4).toString()); BigDecimal data6 = quantity.multiply(new BigDecimal(jTable1.getValueAt(i,5).toString())); data6 = data6.setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal data7 = data4.multiply(data5.multiply(data6)); data7 = data7.setScale(2, BigDecimal.ROUND_HALF_UP); Object[] row = {data1, data2, data3, data4, data5, data6, data7}; DefaultTableModel model2 = (DefaultTableModel) jTable2.getModel(); model2.addRow(row); } }
额外优化说明
额外增加了数字格式校验逻辑,避免用户输入字母、符号等非数值内容时程序崩溃,同时删除了原有代码中冗余的String强转逻辑,toString()已经可以拿到正确的字符串值。
内容的提问来源于stack exchange,提问作者tharinduhd
相关产品推荐
相关产品推荐

