2016-08-06 17 views
9

Tôi có một ứng dụng JavaFX khá lớn hoạt động tốt hầu hết thời gian. Tuy nhiên, đôi khi tôi nhận được ngẫu nhiên ArrayIndexOutOfBoundsExceptions khi nhấp qua ứng dụng. Tôi không thể sao chép các lỗi và không biết khi nào chúng xuất hiện: Đôi khi tôi có thể nhấp qua ứng dụng mà không gặp bất kỳ sự cố nào và đôi khi ứng dụng gặp sự cố và ngăn xếp xuất hiện.Random ArrayIndexOutOfBoundsException trong ứng dụng 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) 

Khi đọc stacktrace, điều duy nhất khiến tôi chú ý là lỗi thậm chí không xảy ra ở một số mã của tôi. Có ai trong số các bạn biết những vấn đề như thế này và có một ý tưởng hay không, nơi tôi có thể bắt đầu điều tra hoặc điều gì có thể gây ra vấn đề này?

Tôi đã thử nó trên JDK 1.8.0_74 (Windows 8.1 x64), JDK 1.8.0_77 (Windows 8.1 x64) và JDK 1.8.0_91 (OS X 10.11)

+3

Bạn có cập nhật ui từ một chủ đề không phải là chuỗi ứng dụng. Có một số vấn đề tương tự trong vài ngày gần đây có liên quan đến việc cập nhật giao diện người dùng từ chuỗi không đúng. – fabian

+1

Bạn có một stacktrace tương đương ở đây http://stackoverflow.com/questions/19769896/unexpected-arrayindexoutofboundsexception-in-javafx-application-refering-to-no có lẽ nó có thể giúp tìm ra những gì sai –

+0

Có thể một điểm ngắt ngoại lệ sẽ giúp , bạn có thể nhảy qua từng khung trong ngăn xếp và phân tích các biến và trường để tìm gốc của vấn đề. – Caelum

Trả lời

0

Cách tốt nhất để đi về việc này là để tìm kiếm tất cả các khai báo mảng và sau đó kiểm tra xem có bất kỳ một trong số chúng được truy cập động hay không, theo cách mà nó có thể làm cho chỉ mục thoát khỏi giới hạn.

Nếu bạn có thể giới thiệu đăng nhập vào ứng dụng của bạn, bạn có thể giới thiệu debug logs (log.debug(myArray.size() + arrayAccessVariable))

Kiểm tra nếu có của các mảng được khởi tạo bởi nguyên liệu đầu vào từ các GUI (một nguồn phổ biến của lỗi).

Tôi nghĩ trong trường hợp của bạn, nó được truy cập bằng -1. Một thực hành tốt là giới thiệu các kiểm tra tiêu cực, ngay trước mỗi lần truy cập.

Một ý tưởng hay khác là sử dụng ArrayList hoặc bất kỳ kiểu dữ liệu nào khác, có thể tự thay đổi kích thước khi cần.

0

Vì tôi khá mới ở JavaFX, tôi có thể sai nhưng tôi phải đối mặt với vấn đề tương tự chính xác này khi viết trò chơi. Vấn đề trong trường hợp của tôi là tôi đã cố di chuyển các đối tượng từ một luồng khác với "Chủ đề ứng dụng JavaFX". Vì bạn chưa cung cấp mã của mình, tôi không thể chắc chắn nhưng tôi sẽ đề nghị bạn thực hiện bất kỳ thay đổi nào đối với GUI chỉ thông qua "Chủ đề ứng dụng JavaFX" và điều đó sẽ khắc phục nó.

Các vấn đề liên quan