Other java.lang.IndexOutOfBoundsException, but index <size

I just ported all my arrays to an ArrayList (due to my great lack of knowledge in Java, I did not know that the underlying array type does not have the ".add" option) in my small program, and everything seems to be fine ... except that from time to time an exception occurs, but it contradicts itself:

 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) 

The code block that Java tells me is:

 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)); } } 

The error does not cause any problems with the program performance. However, I would appreciate that someone could explain to me what the reason for this exception is.

Thanks!

+6
source share
1 answer

This will be a problem of simultaneous modification. This is the only way to get this error.

The reason you are not getting a simultaneous modification error is because the way you execute the loop does not create an iterator, and therefore there is no way to modify the error at the same time.

I suggest synchronizing your arraylist or using something like CopyOnWriteArrayList .

Edit: Sorry CopyOnWrite will not work for this particular problem. To do this, you need to switch to the foreach loop.

In response to your comment below:

Synchronization:

 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)); } } 

and then add similar synchronized(elipsasCol){} anywhere you touch elipsasCol .

or

 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)); } } 

which is likely to cause a simultaneous modification error. At this point, you can switch the ArrayList to CopyOnWriteArrayList or synchronize it.

+11
source

Source: https://habr.com/ru/post/915042/


All Articles