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

从数据库填充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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:37:04