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

从JTable删除行时触发ArrayIndexOutOfBoundsException异常求助

解决JTable删除行时的ArrayIndexOutOfBoundsException异常

你遇到的java.lang.ArrayIndexOutOfBoundsException: 1 > 0异常,问题主要出在clearTable1()方法的循环逻辑上,另外tableData()方法也有一处小问题需要修正,下面一步步给你分析和解决:

1. 问题根源分析

(1)clearTable1()的循环逻辑错误

先看你的清空表格代码:

public void clearTable1(){ 
    while(model1.getRowCount()>0){ 
        for(int i = 0;i<model1.getRowCount();i++){ 
            model1.removeRow(i); 
        } 
    } 
}

当你调用removeRow(i)时,表格模型的行数会实时减少,但循环变量i仍在递增,这就会导致索引越界。举个例子:

  • 假设model1初始有2行,进入for循环后i=0,删除第0行,此时行数变为1;
  • i自增到1,此时i < model1.getRowCount()(即1 < 1)不成立,for循环直接结束;
  • while循环检测到行数还是1,再次进入for循环,i=0删除第0行,行数变为0,循环结束。

虽然这个例子最后能清空,但如果行数更多,或者在删除过程中其他操作影响行数,就会触发索引越界。而且这种写法既冗余又容易出错。

(2)tableData()的插入位置错误

你的tableData()方法是给表格1加载数据,但插入行时用的是tbl_buy.getRowCount():

model1.insertRow(tbl_buy.getRowCount(), new Object[]{...});

这会导致插入位置错误,应该用model1.getRowCount()来获取当前模型的行数,确保数据追加到表格末尾。

2. 修复方案

(1)简化clearTable1()方法

表格模型自带了清空所有行的方法,直接调用setRowCount(0)即可,不需要自己写循环:

public void clearTable1(){ 
    model1.setRowCount(0); // 一行代码搞定清空,安全又高效
}

如果一定要手动循环删除,建议从后往前删,避免索引偏移:

public void clearTable1(){ 
    int rowCount = model1.getRowCount();
    for(int i = rowCount - 1; i >= 0; i--){ 
        model1.removeRow(i); 
    } 
}

(2)修正tableData()的插入索引

把tbl_buy.getRowCount()改成model1.getRowCount():

private void tableData(){ 
    try{ 
        String sql1 = "select * from Products"; 
        db.rs = db.st.executeQuery(sql1); 
        while(db.rs.next()){ 
            model1.insertRow(model1.getRowCount(), new Object[]{ 
                db.rs.getString("pid").toUpperCase(), 
                db.rs.getString("pname").toUpperCase(), 
                db.rs.getString("pcompany"), 
                db.rs.getString("modelNo"), 
                db.rs.getString("color"), 
                db.rs.getFloat("purch_amt"), 
                db.rs.getFloat("sale_amt") 
            }); 
        } 
    } catch(SQLException e){ 
        JOptionPane.showMessageDialog(this, e); 
    } 
}

(3)额外的优化建议

  • 数据库操作建议用PreparedStatement代替直接拼接SQL,避免SQL注入风险:
    String sql = "delete from Products where pid = ?";
    PreparedStatement pstmt = db.conn.prepareStatement(sql);
    pstmt.setString(1, model1.getValueAt(i, 0).toString());
    pstmt.executeUpdate();
    
  • 在操作表格模型时,建议先调用model1.fireTableDataChanged()确保视图和数据同步(不过大部分情况下DefaultTableModel会自动触发)。

3. 验证修复

修改完代码后,再次测试删除操作:点击表格1的行,数据会添加到表格2,数据库中对应行被删除,表格1会被清空并重新加载最新数据,不会再出现数组越界异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:57:51