【发布时间】:2015-06-10 01:10:42
【问题描述】:
我目前正在结合 LWJGL 库制作 JavaFX 关卡编辑器,以实现 OpenGL 功能,从而使用多线程。
然而,我的问题是,有时当我触发 JavaFX 事件时(当我按下按钮/键等时)我会自发地得到 java.lang.NullPointerException。我似乎无法弄清楚错误发生的确切时间,并且由于某种奇怪的原因,堆栈跟踪不会向我提供异常发生的位置。我所知道的是,当我以某种方式与 JavaFX 应用程序线程交互时会发生这种情况。
但是,当它确实发生时,它不仅将它打印到控制台一次然后崩溃。发生的情况是应用程序不断地一遍又一遍地打印出错误消息,直到我强制关闭应用程序。发生错误时,我似乎无法再触发某些特定事件。
这是我收到的自发重复错误消息:
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
at javafx.scene.Scene$ScenePulseListener.synchronizeSceneNodes(Unknown Source)
at javafx.scene.Scene$ScenePulseListener.pulse(Unknown Source)
at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Unknown Source)
at com.sun.javafx.tk.Toolkit$$Lambda$153/452428720.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Unknown Source)
at com.sun.javafx.tk.Toolkit.firePulse(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$400(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit$$Lambda$42/424424770.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$145(Unknown Source)
at com.sun.glass.ui.win.WinApplication$$Lambda$38/12064136.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
我猜这与“同步节点”有关。由于我正在使用多线程以使用 OpenGL 运行渲染循环,因此这可能与案例有关。我也在使用来自 Java8 的 Lambda 表达式,显然正如它在错误日志中所说的那样,它也与它们有关。
我不希望有人给我一个确切的答案,我的问题是什么,我做错了什么,因为我没有提供任何代码(因为我的项目太大,我不知道异常在哪里发生)。 不过,我有几个一般性问题:
这个错误日志是什么意思?
这可能是什么原因?
为什么它没有向我提供异常发生位置的任何信息?
通过将 Eclipse 中的 JRE 从 JRE 安装切换到 JDK 提供的 jar,我设法从堆栈跟踪中获取行号。这让我可以从已编译的 API(例如 JavaFX 本身)中获取行号。
这是新的错误日志:
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
at javafx.scene.Scene$ScenePulseListener.synchronizeSceneNodes(Scene.java:2289)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2419)
at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:314)
at com.sun.javafx.tk.Toolkit$$Lambda$153/478814140.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:313)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:340)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:525)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:505)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$400(QuantumToolkit.java:334)
at com.sun.javafx.tk.quantum.QuantumToolkit$$Lambda$42/1940618951.run(Unknown Source)
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$145(WinApplication.java:101)
at com.sun.glass.ui.win.WinApplication$$Lambda$38/640174177.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
我的错误存在于 JavaFX 类中,并且可能存在于我的 lambda 表达式中,因为它仍然说(未知来源)的唯一地方是它也说“lambda”的地方。也许堆栈跟踪无法在 lambdas 中显示行号?
无论如何,这是返回 NullPointerException 的代码行:
if (node.getScene() == Scene.this)
这是在 JavaFX 场景类中
【问题讨论】:
-
@RealSkeptic 这个问题不是“什么是空指针异常”。非常具体。
-
致任何投票结束此问题的人 - 请不要,除非我们排除它不是 JavaFX 特定的。
标签: java multithreading exception lambda javafx