我正在尝试从Java容器中删除除第一个子组件之外的所有组件。以下代码记录“有3”,并引发ArrayIndexOutOfBoundsException:数组索引超出范围:2

int componentCount = cardPanel.getComponentCount();
logger.info("There are " + componentCount);
for (int i = 1; i < componentCount; i++) {
    cardPanel.remove(i);
}


但是,此修改后的版本可以完美运行:

Component[] components = cardPanel.getComponents();
logger.info("There are " + components.length);
for (int i = 1; i < components.length; i++) {
    cardPanel.remove(components[i]);
}


看来Container.getComponentCount()和Container.remove(int i)不能就容器中的组件数量达成共识。还有其他人遇到这个问题吗?

最佳答案

当您执行cardPanel.remove(i)时,组件的数量正在减少。

因此,您有[0,1,2],然后从索引1处删除项目。
现在您有了[0,2]并删除了索引2处的项目,这将引发ArrayIndexOutOfBoundsException。

修改后的版本之所以有效,是因为它是从容器中删除实际对象,而不是从索引中删除。

试试这个

int componentCount = cardPanel.getComponentCount();
logger.info("There are " + componentCount);
for (int i = 1; i < componentCount; i++) {
    cardPanel.remove(1);
}

10-06 11:50