创建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 _))))
额外注意事项:
- 程序退出时务必调用
cb.free()释放回调关联的本地资源,避免内存泄漏。 - 你代码里用
GLFW_PRESS触发窗口关闭,而教程用的是GLFW_RELEASE,这是逻辑差异,可根据需求自行调整。
内容的提问来源于stack exchange,提问作者user1785730
相关产品推荐
相关产品推荐

