从数据库填充JTable并计算列总和时触发NumberFormatException异常
解决Java Swing中JTable计算列总和时的NumberFormatException异常
问题描述
点击按钮计算JTable列总和时抛出以下异常:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null
原代码
填充JTable的方法
public void showData4() { try { String search = jTextField1.getText(); Connection con = Connectionz.getConnection(); PreparedStatement pst = con.prepareStatement("select * from ReceiptTable where ReceivedFrom='" + search + "'"); ResultSet rs = pst.executeQuery(); while (rs.next()) { String billno = rs.getString("ReceiptNo"); String billdt = rs.getString("ReceivingDate"); String truck = rs.getString("BillNo"); String party = rs.getString("Amount"); String billval = rs.getString("ReceivedBy"); Object[] obj = {billno, billdt, truck, party, billval}; model = (DefaultTableModel) jTable4.getModel(); model.addRow(obj); } } catch (Exception e) { // 空异常处理,无法排查问题 } }
计算总和的按钮事件
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { int total = 0; for (int i = 0; i < jTable4.getRowCount(); i++){ int amount = Integer.parseInt((String) jTable2.getValueAt(i, 3)); total += amount; } System.out.println(total); }
问题分析
- 表格对象混淆:计算总和时错误使用
jTable2,但实际数据填充在jTable4中,导致获取的单元格值可能为null - 字段映射错误:
showData4方法中字段对应逻辑混乱,将数据库Amount字段错误赋值到表格列,后续计算时无法正确获取金额数据 - 空值未处理:数据库中
Amount字段可能为空,或单元格值为null,直接调用Integer.parseInt会触发NumberFormatException - SQL注入风险:通过字符串拼接构造SQL语句,存在安全漏洞
- 空异常捕获:
showData4中的catch块为空,无法定位填充数据时的潜在问题
修复方案
1. 修正填充数据的方法
public void showData4() { try { String search = jTextField1.getText(); Connection con = Connectionz.getConnection(); // 使用参数绑定避免SQL注入,明确指定查询字段避免顺序混乱 PreparedStatement pst = con.prepareStatement("select ReceiptNo, ReceivingDate, BillNo, Amount, ReceivedBy from ReceiptTable where ReceivedFrom=?"); pst.setString(1, search); ResultSet rs = pst.executeQuery(); model = (DefaultTableModel) jTable4.getModel(); // 先清空旧数据,避免重复加载 model.setRowCount(0); while (rs.next()) { String billno = rs.getString("ReceiptNo"); String billdt = rs.getString("ReceivingDate"); String truck = rs.getString("BillNo"); // 处理Amount字段为空的情况,默认设为0 String amountStr = rs.getString("Amount"); if (amountStr == null || amountStr.trim().isEmpty()) { amountStr = "0"; } String receivedBy = rs.getString("ReceivedBy"); Object[] obj = {billno, billdt, truck, amountStr, receivedBy}; model.addRow(obj); } } catch (SQLException e) { // 打印异常信息,方便排查问题 e.printStackTrace(); } }
2. 修正计算总和的按钮事件
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { int total = 0; for (int i = 0; i < jTable4.getRowCount(); i++){ Object cellValue = jTable4.getValueAt(i, 3); // 处理单元格值为null或非字符串的情况 if (cellValue == null) { continue; } String amountStr = cellValue.toString().trim(); try { int amount = Integer.parseInt(amountStr); total += amount; } catch (NumberFormatException e) { // 遇到非数值格式的内容,打印错误信息后跳过 System.err.println("第" + (i+1) + "行的金额格式错误:" + amountStr); } } System.out.println("总和:" + total); }
额外优化建议
- 数据库层面保证
Amount字段为数值类型(如INT),填充数据时直接获取int值,避免字符串转换 - 使用
DefaultTableModel时指定列类型,让表格数据更规范 - 异常处理不要留空,至少打印堆栈信息,便于问题排查
内容的提问来源于stack exchange,提问作者Rajdip Majumdar
相关产品推荐
相关产品推荐

