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

JTable多类型列数据模型遇ArrayStoreException问题求助

问题分析与解决方案

核心错误原因

触发java.lang.ArrayStoreException的直接原因是:你在loadRankingsTable方法中,将model.rows重新赋值为**String[][]类型的数组**,但后续addModelRow方法中试图往这个数组里存入Integer和Double对象。由于Java数组的类型是固定的,String[][]只能存储String类型元素,无法容纳其他类型的对象,因此抛出异常。

修复步骤与优化代码

1. 修正数组类型初始化

将loadRankingsTable中的数组初始化语句从String[][]改为Object[][]:

private void loadRankingsTable() {
    int r = 0;
    // 改为Object[][]类型,兼容所有数据类型
    model.rows = new Object[S.getCurrentArchive().partnerCensus.size()][6];
    for (String p : S.getCurrentArchive().partnerCensus) {
        PartnerDealFilter pf = new PartnerDealFilter(p); 
        addModelRow(pf, p, r++);
    }
}

2. 简化数据赋值逻辑

addModelRow中无需额外包装成strings、integers、doubles数组,直接赋值更简洁:

private void addModelRow(DealFilter f, String key, int r) {
    Archive a = S.getCurrentArchive().getFilteredArchive(f);
    Integer max = -24; 
    Integer min = 24;
    Integer count = 0;
    for (DealNode dn : a.getDeals()) {
        Integer imps = dn.getIMPsVsPar();
        if (imps != null) {
            count++;
            if (imps < min) min = imps;
            if (imps > max) max = imps;
        }
    }
    // 直接赋值,无需额外数组包装
    model.rows[r][0] = key;
    model.rows[r][1] = count;
    model.rows[r][2] = a.getNetIMPs();
    model.rows[r][3] = max;
    model.rows[r][4] = min;
    model.rows[r][5] = a.getAvgIMPs() != null ? a.getAvgIMPs() : -24.01;        
}

3. 更规范的TableModel使用方式(可选推荐)

直接操作rows数组属于绕过DefaultTableModel的API规范,更稳妥的方式是使用DefaultTableModel自带的addRow方法,无需手动维护rows数组:

class RankingsDataModel extends DefaultTableModel {
    static final String[] columnNames = { "Key", "Net IMPs", "Count", "Max IMPs", "Min IMPs", "Avg IMPs" };
    static int[] widths = new int[] { 16, 16, 16, 16, 16, 16  };

    public RankingsDataModel() {
        super(columnNames, 0); // 初始化列名,行初始为0
    }

    @Override
    public Class getColumnClass(int c) {
        return switch(c) {
            case 0 -> String.class;
            case 5 -> Double.class;
            default -> Integer.class;
        };
    }

    @Override
    public boolean isCellEditable(int row, int col) { 
        return false; 
    }       
}

// 加载数据时直接用addRow
private void loadRankingsTable() {
    model = new RankingsDataModel();
    for (String p : S.getCurrentArchive().partnerCensus) {
        PartnerDealFilter pf = new PartnerDealFilter(p); 
        addModelRow(pf, p);
    }
}

private void addModelRow(DealFilter f, String key) {
    Archive a = S.getCurrentArchive().getFilteredArchive(f);
    Integer max = -24; 
    Integer min = 24;
    Integer count = 0;
    for (DealNode dn : a.getDeals()) {
        Integer imps = dn.getIMPsVsPar();
        if (imps != null) {
            count++;
            if (imps < min) min = imps;
            if (imps > max) max = imps;
        }
    }
    // 构造一行数据并添加到模型
    Object[] rowData = {
        key,
        count,
        a.getNetIMPs(),
        max,
        min,
        a.getAvgIMPs() != null ? a.getAvgIMPs() : -24.01
    };
    model.addRow(rowData);
}

这种方式遵循Swing组件的设计规范,避免了直接操作内部数组可能带来的意外问题,同时也能自动触发表格的更新事件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:15:30