Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 触发事件时的自发NullPointerException_Java_Multithreading_Exception_Lambda_Javafx - Fatal编程技术网

Java 触发事件时的自发NullPointerException

Java 触发事件时的自发NullPointerException,java,multithreading,exception,lambda,javafx,Java,Multithreading,Exception,Lambda,Javafx,我目前正在结合LWJGL库制作一个JavaFX级别的编辑器,以实现OpenGL功能,从而使用多线程 然而,我的问题是,有时当我触发JavaFX事件时(当我按下按钮/键等),我会得到这种自发的java.lang.NullPointerException。我似乎无法弄清楚错误发生的确切时间模式,出于某种奇怪的原因,stacktrace无法向我提供异常发生的位置。我所知道的是,当我以某种方式与JavaFX应用程序线程交互时,它就会发生 但是,当它确实发生时,它不仅会将其打印到控制台一次,然后崩溃。发生

我目前正在结合LWJGL库制作一个JavaFX级别的编辑器,以实现OpenGL功能,从而使用多线程

然而,我的问题是,有时当我触发JavaFX事件时(当我按下按钮/键等),我会得到这种自发的
java.lang.NullPointerException
。我似乎无法弄清楚错误发生的确切时间模式,出于某种奇怪的原因,stacktrace无法向我提供异常发生的位置。我所知道的是,当我以某种方式与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,我成功地从stacktrace中获取行号。这使我能够从编译的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”的地方。也许stacktrace无法在lambdas中显示行号

    无论如何,这是返回NullPointerException的代码行:

    if (node.getScene() == Scene.this)
    

    这在JavaFX场景类中,不是答案,只是解决一个非常类似的问题(Swing问题)的建议

    为了避免任何猜测,我们应该查看源代码-解析“未知源”部分。 您提供的stacktrace缺少行号。 这是因为,标准JRE在编译时没有任何调试信息。 我相信,在《太阳时报》上,有一次,人们可以下载一个针对开发人员的单独发行版,其中包含所有调试符号。 这使得,除了有确切的行号外,还可以在JDK代码中设置断点

    我们可以从那里开始调查问题

    如果没有带有调试符号的JRE,您可以尝试编译自己的JRE! 我曾经成功编译过JDK发行版附带的“src.zip”文件。但它不是独立的!缺少了几个部分,一些特定于Linux的类等等。来自JDK的javac本身就有文件问题——它一直都没有内存。幸运的是,Eclipse的javac编译器可以处理大型代码库和部分编译类

    然后,我在引导类路径上使用生成的jar(使用调试符号编译的src.zip)运行程序。通常,不允许修改“java.”和“sun.”包中的任何内容。使用引导类路径,您可以

    现在,回到您的特定问题:JavaFX和OpenGL都通过所谓的“线程限制”来解决多线程问题。这意味着,一切都是单线程的。您的问题可能是因为javaFx和OpenGL都有各自的线程!我打赌,您在JavaFX的EDT之外进行了一些交互。但是,这只是一个牵强的假设。尝试获取源代码行,我们可以从那里继续

    在我需要调试信息的时候,我从这里得到了答案:

    但是,可能不需要所有的工作!我刚刚了解到,您可以将源文件本身附加到引导类路径,如下所述:


    更新

    因此,“node”引用似乎为null(我怀疑“this”为null)。 下一步将识别空节点并找到添加它的确切时间。我可能会在程序中所有合理的“addNode”调用处设置一些断点(或打印输出语句)

    从源代码(我快速浏览了一遍)来看,“null”引用似乎来自“dirtyNodes”数组

    我的最佳选择通常是,您正在从正确的线程外部间接调用addToDirtyNodes()。令我惊讶的是,有一行检查它是否从正确的线程调用:

    getToolkit().checkFxUserThread()

    您是否碰巧看到“不在FX应用程序线程上;currentThread=“在程序的输出中


    我们只希望,这不是JavaFX本身的一个bug。

    如前所述,我们也有这个问题。这似乎是由于从
    JavaFX.concurrent.Service
    任务
    调用()
    方法中更新UI造成的,尽管更新是从移交给
    平台的lambda中执行的。runLater()


    因此,我将UI更新代码从那里移到了成功/失败处理程序上的
    服务中,它本来应该在那里。这似乎已经消除了我们的问题。

    不要在非GUI线程上修改GUI

    因为我没有看到你的代码,我不知道你到底在哪里做的,但我有同样的问题,结果我有一个pa