You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建GLFWKeyCallback时遇UnsupportedOperationException错误求助

问题:LWJGL回调注册时抛出UnsupportedOperationException(address方法)

我正在跟随LWJGL教程开发,编写了如下按键回调代码:

(def cb (proxy [java.lang.Object GLFWKeyCallbackI] []
          (invoke [window keycode _ action _]
            (when (and (= keycode GLFW/GLFW_KEY_ESCAPE)
                       (= action GLFW/GLFW_PRESS))
              (GLFW/glfwSetWindowShouldClose window true)))))

注册回调的代码:

(GLFW/glfwSetKeyCallback window cb)

运行时抛出错误:

Execution error (UnsupportedOperationException) at lwjgl_intro.core.proxy$java.lang.Object$GLFWKeyCallbackI$84f3fd50/address (REPL:-1).
address

教程中的对应Java代码片段:

glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> {
    if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE )
        glfwSetWindowShouldClose(window, true); // We will detect this in the rendering loop
});

请问为何会出现该错误?


原因与解决方法

  • 核心原因:你错误地用proxy将Object和GLFWKeyCallbackI接口组合实现回调。LWJGL的回调接口(如GLFWKeyCallbackI)要求实现类必须继承LWJGL提供的抽象回调类(比如GLFWKeyCallback),而非直接实现接口。这些抽象类已经内置实现了address()等LWJGL内部依赖的方法,直接实现接口生成的代理类缺少这些方法,就会触发UnsupportedOperationException。

  • 修复后的回调代码:把proxy的父类换成GLFWKeyCallback,同时记得调用父类的invoke方法保证资源处理:

(def cb (proxy [GLFWKeyCallback] []
          (invoke [window keycode _ action _]
            (when (and (= keycode GLFW/GLFW_KEY_ESCAPE)
                       (= action GLFW/GLFW_PRESS))
              (GLFW/glfwSetWindowShouldClose window true))
            (proxy-super invoke window keycode _ action _))))

额外注意事项:

  1. 程序退出时务必调用cb.free()释放回调关联的本地资源,避免内存泄漏。
  2. 你代码里用GLFW_PRESS触发窗口关闭,而教程用的是GLFW_RELEASE,这是逻辑差异,可根据需求自行调整。

内容的提问来源于stack exchange,提问作者user1785730

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:05:04