2016-08-06 13 views
9

Mam dość dużą aplikację JavaFX, która działa dobrze przez większość czasu. Czasami jednak uzyskuję losowe wyjątki ArrayIndexOutOfBoundsException podczas klikania w aplikację. Nie mogę odtworzyć błędów i nie wiem, kiedy się pojawią: Czasami mogę bez problemu klikać aplikację, a czasami aplikacja ulega awarii i pojawia się komunikat stacktrace.Wyjątek Random ArrayIndexOutOfBoundsException w aplikacji JavaFX

Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException: -1 
at java.util.ArrayList.elementData(ArrayList.java:418) 
at java.util.ArrayList.get(ArrayList.java:431) 
at javafx.scene.Parent.updateCachedBounds(Parent.java:1591) 
at javafx.scene.Parent.recomputeBounds(Parent.java:1535) 
at javafx.scene.Parent.impl_computeGeomBounds(Parent.java:1388) 
at javafx.scene.layout.Region.impl_computeGeomBounds(Region.java:3078) 
at javafx.scene.Node.updateGeomBounds(Node.java:3577) 
at javafx.scene.Node.getGeomBounds(Node.java:3530) 
at javafx.scene.Node.getLocalBounds(Node.java:3478) 
at javafx.scene.Node.updateTxBounds(Node.java:3641) 
at javafx.scene.Node.getTransformedBounds(Node.java:3424) 
at javafx.scene.Node.updateBounds(Node.java:559) 
at javafx.scene.Parent.updateBounds(Parent.java:1719) 
at javafx.scene.Parent.updateBounds(Parent.java:1717) 
at javafx.scene.Parent.updateBounds(Parent.java:1717) 
at javafx.scene.Parent.updateBounds(Parent.java:1717) 
at javafx.scene.Parent.updateBounds(Parent.java:1717) 
at javafx.scene.Parent.updateBounds(Parent.java:1717) 
at javafx.scene.Parent.updateBounds(Parent.java:1717) 
at javafx.scene.Parent.updateBounds(Parent.java:1717) 
at javafx.scene.Parent.updateBounds(Parent.java:1717) 
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2404) 
at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:354) 
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:381) 
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510) 
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490) 
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
at java.lang.Thread.run(Thread.java:745) 

Po przeczytaniu StackTrace, jedyną rzeczą, która przykuła moją uwagę to, że błąd nie zdarzyć nawet w niektórych z mojego kodu. Czy ktoś z was zna takie problemy i ma pomysł, w którym mogę rozpocząć dochodzenie lub co może być przyczyną tego problemu?

Próbowałem go na JDK 1.8.0_74 (Windows 8.1 x64), JDK 1.8.0_77 (Windows 8.1 x64) i JDK 1.8.0_91 (OS X 10.11)

+3

Czy aktualizujesz ui z wątku innego niż wątek aplikacji. W ciągu kilku ostatnich dni pojawiło się kilka podobnych problemów związanych z aktualizacją interfejsu z niewłaściwego wątku. – fabian

+1

Masz równoważny stacktrace tutaj http://stackoverflow.com/questions/19769896/unexpected-arrayindexboundfectionsexception-in-javafx-application-refering-to-no może może pomóc dowiedzieć się, co jest nie tak –

+0

Może punkt wyjścia wyjątku pomoże , możesz przeskoczyć przez każdą ramkę w stosie i przeanalizować zmienne i pola, aby znaleźć przyczynę problemu. – Caelum

Odpowiedz

0

Najlepszym sposobem, aby go o to, aby zwracaj uwagę na wszystkie deklaracje tablicowe, a następnie sprawdzaj, czy któryś z nich jest dostępny dynamicznie, w taki sposób, że może spowodować, że indeks wyjdzie poza granice.

Jeśli można wprowadzić zalogowaniu się do aplikacji, można wprowadzać Debug logs (log.debug(myArray.size() + arrayAccessVariable))

Sprawdź, czy którykolwiek z tablic jest inicjowana przez wejścia z GUI (wspólne źródło błędu).

Myślę, że w twoim przypadku jest on dostępny przez -1. Dobrą praktyką jest wprowadzanie ujemnych czeków tuż przed każdym dostępem.

Innym dobrym pomysłem byłoby użycie ArrayList lub dowolnego innego typu, który może zmienić rozmiar w razie potrzeby.

0

Ponieważ jestem całkiem nowy w JavaFX, może się mylę, ale napotkałem ten sam problem podczas pisania gry. Problem w moim przypadku polegał na tym, że próbowałem przenieść obiekty z innego wątku niż "Wątek aplikacji JavaFX". Ponieważ nie podałeś swojego kodu, nie mogę być pewny, ale sugerowałbym, abyś wprowadził zmiany w GUI tylko poprzez "Wątek aplikacji JavaFX" i to powinno go naprawić.

Powiązane problemy