LibGDX中使用proxy出现UnsupportedOperationException错误排查求助
问题:LibGDX开发中Screen代理类抛出UnsupportedOperationException
报错详情
Execution error (UnsupportedOperationException) at bucket_drops_screen_extension.main_menu.proxy$java.lang.Object$Screen$e6e56cf1/show (REPL:-1). show
我的代码片段
(defn screen [] (proxy [java.lang.Object Screen] [] (render [delta] (.clear ScreenUtils Color/BLACK) (.apply (deref globals/viewport)) (let [matrix (.. @globals/viewport getCamera combined)] (.setProjectionMatrix @globals/sprite-batch matrix)) (.begin @globals/sprite-batch) (.draw @globals/font @globals/sprite-batch "test" 1 1) (.end @globals/sprite-batch)) (resize [x y] (.update @globals/viewport x y true))))
代码问题分析
LibGDX的Screen是一个接口,在Clojure中用proxy实现接口时,必须覆盖所有抽象方法。Screen接口要求实现show()、hide()、pause()、resume()、dispose()等方法,你只实现了render和resize,未实现的方法默认会抛出UnsupportedOperationException——游戏调用show()方法时触发了这个默认逻辑,导致报错。
另外,proxy参数里不需要显式继承java.lang.Object,Clojure实现接口时会自动处理父类逻辑。
修复后的代码:
(defn screen [] (proxy [Screen] [] (render [delta] (.clear ScreenUtils Color/BLACK) (.apply (deref globals/viewport)) (let [matrix (.. @globals/viewport getCamera combined)] (.setProjectionMatrix @globals/sprite-batch matrix)) (.begin @globals/sprite-batch) (.draw @globals/font @globals/sprite-batch "test" 1 1) (.end @globals/sprite-batch)) (resize [x y] (.update @globals/viewport x y true)) (show []) (hide []) (pause []) (resume []) (dispose [])))
这类错误的定位方法
- 聚焦报错方法名:报错直接指向
show方法,说明该方法的实现存在问题。对于接口代理类的异常,优先检查是否覆盖了接口的所有抽象方法。 - 核对接口文档:查LibGDX官方文档,确认
Screen接口的所有必填方法,逐一对照代码补全。 - REPL辅助检查:在Clojure REPL中导入
Screen接口后,用(.getMethods Screen)打印所有方法,快速确认哪些方法未实现。 - 牢记代理类默认行为:Clojure的
proxy对未实现的接口方法,默认逻辑就是抛出UnsupportedOperationException,遇到这类异常直接关联接口方法完整性问题。
内容的提问来源于stack exchange,提问作者user1785730
相关产品推荐
相关产品推荐

