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

Clojure递归函数基准用例正常 递归调用触发NullPointerException求助

异常原因

NullPointerException由两个Clojure语法使用错误导致:

  • 核心错误:if表达式的else分支额外包裹了一层括号。Clojure中括号具有执行语义,你写的代码:
(if (empty? lis) (flush) ((println "Entra al else") (prn lis)  (imprimir (rest lis) orig)))

当lis不为空进入else分支时,Clojure会先执行括号内的第一个表达式(println "Entra al else"),拿到返回值nil后,会把nil当成函数,后续(prn lis)、(imprimir (rest lis) orig)的执行结果当成入参调用nil,调用nil作为函数就会直接抛出NullPointerException。

  • 附加错误:你定义了多个独立的if表达式,Clojure函数默认返回最后一个表达式的执行结果,你最后一个表达式是(if (empty? lis) orig ),当lis不为空时这个表达式返回nil,不符合你要返回orig的预期。

修复代码

按你的预期逻辑调整后的精简版本代码如下,可直接输出你要求的结果:

(defn imprimir
  ([elem]
   (when (not (sequential? elem))
     (println elem)
     elem))
  ([lis orig]
   (if (empty? lis)
     orig
     (do
       (prn lis)
       (imprimir (rest lis) orig)))))

;; 测试调用
(println (imprimir '(1 2 3 4 5) "saraza"))

执行结果

运行上述代码会输出你预期的内容:

(1 2 3 4 5)
(2 3 4 5)
(3 4 5)
(4 5)
(5)
saraza

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:27:06