从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
相关产品推荐
相关产品推荐

