JTable删除/添加数据后重绘报ArrayIndexOutOfBoundsException异常求助
解决JTable删除后重新填充时的ArrayIndexOutOfBoundsException问题
你遇到的这个删除后刷新表格触发数组越界的问题,我帮你梳理出代码里的几个关键错误点,逐个修复就能解决:
1. Modell类getColumnClass方法的两处致命错误
你的表格一共6列(columnName数组长度为6),列索引是0到5,但代码里犯了两个错误:
- 错误判断图标列是
column == 6,本身就超出了列索引范围; - 当表格没有数据(删除后list为空)时,
getValueAt(0, column)会直接访问空数组的第0行,这就是错误栈里ArrayIndexOutOfBoundsException: 0的直接原因。
修复后的getColumnClass方法:
@Override public Class getColumnClass(int column){ // 图标列是第5列(索引从0开始计数) if (column == 5){ return Icon.class; } // 表格无数据时返回默认Object类,避免访问空行 if(getRowCount() == 0){ return Object.class; } return getValueAt(0, column).getClass(); }
2. table_order方法中图标列赋值错误
在处理无图片的情况时,你错误地把rows[i][4](这是"Availability"列)设为null,应该修改为对应Icon列的rows[i][5]:
if(list.get(i).getMyImage() != null){ ImageIcon image = new ImageIcon(new ImageIcon(list.get(i).getMyImage()).getImage() .getScaledInstance(150, 75, Image.SCALE_SMOOTH) ); rows[i][5] = image; } else{ // 修正为第5列(Icon列) rows[i][5] = null; }
3. 删除按钮中多余的removeAll调用
table_item.removeAll();完全没必要,因为setModel(model)会直接替换表格的数据源模型,重新渲染所有数据,这个调用反而可能干扰表格的正常渲染流程,直接删除即可。
额外建议:修复SQL注入风险
你的SQL语句直接拼接用户输入的codev,存在严重的SQL注入风险,改成预编译语句的参数绑定写法更安全:
// 删除操作的正确写法 ps = conn.prepareStatement("DELETE FROM items WHERE item_code=?"); ps.setString(1, codev); int row = ps.executeUpdate();
查询数据是否存在的语句也应该改成这种参数绑定的形式。
把这些修复点全部处理后,再测试删除操作,应该就不会再触发数组越界异常了。
内容的提问来源于stack exchange,提问作者user9171819
相关产品推荐
相关产品推荐

