2016-08-06 2 views
9

대부분의 경우 잘 작동하는 다소 큰 JavaFX 응용 프로그램이 있습니다. 그러나 응용 프로그램을 클릭 할 때 임의의 ArrayIndexOutOfBoundsExceptions가 표시되는 경우가 있습니다. 나는 오류를 재현 할 수없고 그들이 언제 나타나는지 모른다 : 때로는 문제없이 응용 프로그램을 클릭 할 수 있으며 때때로 응용 프로그램이 충돌하고 stacktrace가 나타납니다. 스택 트레이스를 읽을 때JavaFX 응용 프로그램에서 임의의 ArrayIndexOutOfBoundsException이 발생했습니다.

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) 

, 내 관심을 끌었 유일한 것은 오류도 내 코드의 일부에서 발생하지 않습니다. 누구든지 이와 같은 문제를 알고 있으며 조사를 시작할 수있는 곳이나이 문제의 원인이 될 수있는 아이디어가 있습니까?

내가 JDK 1.8.0_74 (윈도우 8.1 64), JDK 1.8.0_77 (윈도우 8.1 64)와 JDK 1.8.0_91에 그것을 시도 (OS X 10.11)

+3

응용 프로그램 스레드가 아닌 다른 스레드에서 ui를 업데이트합니까? 지난 며칠 동안 잘못된 스레드에서 UI를 업데이트하는 것과 관련된 몇 가지 유사한 문제가있었습니다. – fabian

+1

여기에 해당하는 스택 추적이 있습니다. http://stackoverflow.com/questions/19769896/unexpected-arrayindexoutofboundsexception-in-javafx-application-refering-to-no 어쩌면 잘못된 것을 알아내는 데 도움이 될 수 있습니다. –

+0

아마도 예외 브레이크 포인트가 도움이 될 수 있습니다. 스택의 각 프레임을 건너 뛰고 변수 및 필드를 분석하여 문제의 근본 원인을 찾을 수 있습니다. – Caelum

답변

0

이하는 것입니다 가야하는 가장 좋은 방법 모든 배열 선언을 조사한 다음 그 중 하나가 동적으로 액세스되는지 확인하여 인덱스가 경계 밖으로 나가게 할 수 있습니다. 당신은 응용 프로그램에 로깅을 소개 할 수있는 경우 배열의가 GUI (오류의 일반적인 원인)로부터의 입력에 의해 초기화되는 경우

, 당신은 디버그에게 logs (log.debug(myArray.size() + arrayAccessVariable))

확인을 소개 할 수 있습니다.

귀하의 경우에는 -1로 접근하고 있다고 생각합니다. 각 액세스 직전에 부정적인 수표를 도입하는 것이 좋습니다.

또 다른 좋은 생각은 ArrayList이나 다른 데이터 유형을 사용하는 것입니다. 필요할 때 크기를 조정할 수 있습니다.

0

저는 JavaFX에서 꽤 새로운 사람입니다. 게임을 작성하는 동안이 똑같은 문제에 직면했습니다. 제 경우의 문제는 "JavaFX 응용 프로그램 스레드"와는 다른 스레드에서 객체를 이동하려고했습니다. 코드를 제공하지 않았으므로 확신 할 수는 없지만 "JavaFX 응용 프로그램 스레드"를 통해서만 GUI를 변경하고 수정해야한다고 제안합니다.

관련 문제