使用glfwWindowShouldClose时的NPE(Kotlin)

时间:2018-02-06 02:48:09

标签: nullpointerexception kotlin lwjgl

所以我刚开始使用这个tutorial的基本LWJGL 3程序。我已将所有代码转换为Kotlin以使其正常工作,一切似乎都很好。直到我到达他利用glfwWindowShouldClose(window)的最后。我按照他展示的方式尝试了它,以及我自己用函数调用本身替换running变量的方法。我甚至尝试用true替换它。不幸的是,它似乎没有起作用。

澄清一下,我的意思是当我在项目中的任何地方使用glfwWindowShouldClose(window)时,对LWJGL函数的任何调用都会产生NPE,甚至是与它无关的函数:

Exception in thread "thingy" java.lang.NullPointerException
    at org.lwjgl.system.Checks.check(Checks.java:98)
    at org.lwjgl.glfw.GLFW.glfwSwapBuffers(GLFW.java:4206)
    at main.Window.render(main.kt:39)
    at main.Window.run(main.kt:15)
    at java.lang.Thread.run(Thread.java:745)

我在这个错误示例中使用的代码在这里:

class Window: Runnable {
    private val thread = Thread(this, "thingy")
    private val window: Long

    override fun run() {
        while (true) {
            update()
            render()
        }
    }

    init { thread.start(); window = init() }

    private fun init(): Long {
        if (!glfwInit()) System.err.println("Couldn't initialize GLFW.")
        glfwWindowHint(GLFW_RESIZABLE, 1)
        val window = glfwCreateWindow(800, 600, "thingy", NULL, NULL)
        if (window == NULL) System.err.println("Couldn't create a window.")
        val vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor())
        glfwSetWindowPos(window, 100, 100)
        glfwMakeContextCurrent(window)
        glfwShowWindow(window)
        return window
    }

    private fun update() { glfwPollEvents() }

    private fun render() { glfwSwapBuffers(window) }
}

如果我删除了函数调用并将其替换为while语句中的false,则它可以正常工作。我的循环实例本身是否可能导致问题,并且它不会抛出异常的唯一方法是循环是否永远不会发生(false)?

1 个答案:

答案 0 :(得分:1)

您缺少一些重要的来电,例如GL.createCapabilities()

我强烈建议您从HelloWord开始here

Ps:如果你使用kotlin,我有一个lib可以在几行中为你提供一个现成的场景

with(glfw) {
   init()
   windowHint { context.version = "3.3"; profile = "core"; }
}
GlfwWindow(windowSize, title).apply { makeContextCurrent(); show(); }
GL.createCapabilities()