Clojure报PersistentArrayMap转Number异常,未定义该Map求原因
问题分析与修复
错误根源
ClassCastException的本质是你把brick这个Clojure map(PersistentArrayMap类型)当成数字传给了JOML的Vector3f方法。错误栈指向第107行,但实际问题出在两处:
- 第107行:定义
ball-center时直接引用了未初始化的ball-center变量,导致传入nil作为目标Vector,写法不规范。 - 第108行:
(.div brick-size brick (float 2) brick-half-size)中,错误地将brick(map)作为除数参数传入div方法,而JOML的div需要数字或Vector类型,JVM尝试转换map为Number时抛出异常。
修正后的代码
(defn ball-collision? [ball brick] (let [^org.joml.Vector3f ball-pos (:position ball) ^org.joml.Vector3f brick-pos (:position brick) ^org.joml.Vector3f brick-size (:size brick) radius (float (:radius ball)) ; 显式创建目标Vector,避免未初始化引用 ball-center (.add ball-pos radius radius (float 0) (org.joml.Vector3f.)) ; 替换brick为(float 2),正确计算半尺寸 brick-half-size (.div brick-size (float 2) (org.joml.Vector3f.)) brick-center (.add brick-pos brick-half-size (org.joml.Vector3f.)) center-distance (.sub ball-center brick-center (org.joml.Vector3f.)) clamped (clamp center-distance brick-half-size (org.joml.Vector3f.)) closest (.add brick-center clamped (org.joml.Vector3f.)) distance (.sub ball-center closest (org.joml.Vector3f.))] (< (.length distance) radius)))
关键修正点
- 所有JOML方法的目标Vector参数都显式创建
org.joml.Vector3f.实例,避免使用未初始化的变量。 - 第108行把错误的
brick参数换成(float 2),匹配Vector3f.div(float scalar, Vector3f dest)的方法签名,正确实现尺寸减半。 - 确保所有方法参数类型匹配,杜绝将Clojure map传入需要数字/Vector的参数位置。
内容的提问来源于stack exchange,提问作者user1785730
相关产品推荐
相关产品推荐

