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

点击选择JTable行后删除触发ArrayIndexOutOfBoundsException异常的解决咨询

解决JTable删除行时的ArrayIndexOutOfBoundsException异常

这个问题我之前也踩过坑,核心是你搞混了业务账号ID和List集合的索引的区别!你的错误代码里,把表格第一列的账号ID直接当成了bank.getAccounts()这个List的索引来取值,但这俩完全不是一回事——List的索引是从0开始的存储位置序号,而账号ID是业务里的独立标识,比如账号ID是2,但List里可能只有1个元素,这时候调用get(2)自然就会抛出2>=1的越界异常。

下面给你几个靠谱的解决思路,按需选择:

  • 直接用选中行索引操作List(适合表格和List一一对应时)
    如果你的JTable是直接基于bank.getAccounts()这个List渲染的,没有做过滤、排序,那可以直接用选中的行索引去取List里的元素,然后删除:

    if(row >= 0) {
        // 直接用选中的行索引获取List中对应的账号对象
        Account account = bank.getAccounts().get(row);
        bank.removeAccount(account);
        // 关键:删除后要更新表格模型,不然界面不会同步刷新
        ((DefaultTableModel)table_1.getModel()).removeRow(row);
    }
    
  • 转换视图行到模型行(适合表格有排序/过滤时)
    如果你给JTable加了排序或者过滤功能,那界面上选中的行索引(视图行)和表格模型里的行索引(对应List的顺序)可能不一致,这时候需要先转换:

    if(row >= 0) {
        // 把界面选中的行转成模型里的行索引
        int modelRow = table_1.convertRowIndexToModel(row);
        Account account = bank.getAccounts().get(modelRow);
        bank.removeAccount(account);
        ((DefaultTableModel)table_1.getModel()).removeRow(modelRow);
    }
    
  • 通过业务ID查找删除(适合ID和List索引无关时)
    如果你的业务场景必须用账号ID来定位删除,那不要直接用ID当索引,而是遍历List找到对应ID的对象:

    if(row >= 0) {
        String idStr = table_1.getModel().getValueAt(row, 0).toString();
        int accountId = Integer.parseInt(idStr);
        // 遍历集合找到对应ID的账号
        Account targetAccount = null;
        for(Account acc : bank.getAccounts()) {
            if(acc.getId() == accountId) {
                targetAccount = acc;
                break;
            }
        }
        if(targetAccount != null) {
            bank.removeAccount(targetAccount);
            // 同步删除表格里的对应行
            ((DefaultTableModel)table_1.getModel()).removeRow(row);
        }
    }
    

总结一下:永远不要假设业务ID等于集合的存储索引,这是新手很容易犯的逻辑错误,搞清楚两者的区别问题就解决了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:14:22