gpt4 book ai didi

java - 另一个 java.lang.IndexOutOfBoundsException,但索引 < 大小

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:56:27 24 4
gpt4 key购买 nike

我刚刚在我的小程序中将所有数组移植到 ArrayList(由于我对 Java 知识匮乏,我不知道基本数组类型没有任何“.add”选项),一切似乎都很好。 .. 除了不时抛出异常,但它自相矛盾:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 17, Size: 21
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at guay.Puntitos.AumentarTamano(Puntitos.java:346)
at guay.Guay$MiMouse.mouseMoved(Guay.java:226)
at java.awt.Component.processMouseMotionEvent(Component.java:6550)
at java.awt.Component.processEvent(Component.java:6274)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Window.processEvent(Window.java:2016)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Java 指向我的代码块是这样的:

for (int i = 1; i < elipsasCol.size(); i++) {
if (elipsasCol.get(i) != null && elipsasCol.get(i).contains(mouse)) {
// This line
double modulo = Math.sqrt(Math.pow(mouse.x - elipsasCol.get(i).getCenterX(), 2)
+ Math.pow(mouse.y - elipsasCol.get(i).getCenterY(), 2));
}
}

该错误不会对程序的性能造成任何影响。但是,如果有人可以向我解释此异常的原因,我将不胜感激。

谢谢!

最佳答案

这将是一个并发修改问题。这是您获得该错误的唯一方法。

您没有收到并发修改错误的原因是因为您进行循环的方式没有创建迭代器,因此没有机会抛出并发修改错误。

我建议在您的数组列表上同步 或使用诸如 CopyOnWriteArrayList 之类的东西

编辑:抱歉,CopyOnWrite 不适用于此特定问题。您需要切换到 foreach 循环才能使其成为一个选项。

回应您的以下评论:

同步:

synchronized(elipsasCol){
for (int i = 1; i < elipsasCol.size(); i++) {
if (elipsasCol.get(i) != null && elipsasCol.get(i).contains(mouse)) {
// This line
double modulo = Math.sqrt(Math.pow(mouse.x - elipsasCol.get(i).getCenterX(), 2)
+ Math.pow(mouse.y - elipsasCol.get(i).getCenterY(), 2));
}
}

然后添加一个类似的synchronized(elipsasCol){}在你触摸的任何其他地方周围 elipsasCol .

for (T obj : elipsasCol) {
if (obj != null && obj.contains(mouse)) {
// This line
double modulo = Math.sqrt(Math.pow(mouse.x - obj.getCenterX(), 2)
+ Math.pow(mouse.y - obj.getCenterY(), 2));
}
}

这很可能会引发并发修改错误。此时您可以将 ArrayList 切换为 CopyOnWriteArrayList 或围绕它进行同步。

关于java - 另一个 java.lang.IndexOutOfBoundsException,但索引 < 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10474612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com