标题是误导性的 - 这里没有NPE,只有类转换异常。
确实有堆栈跟踪(请注意,我如何在REPL中使用*e
来打印最新的异常)
Clojure 1.11.1
user=> (filter zero? [:hi])
Error printing return value (ClassCastException) at clojure.lang.Numbers/isZero (Numbers.java:119).
class clojure.lang.Keyword cannot be cast to class java.lang.Number (clojure.lang.Keyword is in unnamed module of loader 'app'; java.lang.Number is in module java.base of loader 'bootstrap')
(user=>
user=> *e
#error {
:cause "class clojure.lang.Keyword cannot be cast to class java.lang.Number (clojure.lang.Keyword is in unnamed module of loader 'app'; java.lang.Number is in module java.base of loader 'bootstrap')"
:via
[{:type clojure.lang.ExceptionInfo
:message nil
:data #:clojure.error{:phase :print-eval-result}
:at [clojure.main$repl$read_eval_print__9206 invoke "main.clj" 442]}
{:type java.lang.ClassCastException
:message "class clojure.lang.Keyword cannot be cast to class java.lang.Number (clojure.lang.Keyword is in unnamed module of loader 'app'; java.lang.Number is in module java.base of loader 'bootstrap')"
:at [clojure.lang.Numbers isZero "Numbers.java" 119]}]
:trace
[[clojure.lang.Numbers isZero "Numbers.java" 119]
[clojure.core$zero_QMARK_ invokeStatic "core.clj" 874]
[clojure.core$zero_QMARK_ invoke "core.clj" 869]
[clojure.core$filter$fn__5962 invoke "core.clj" 2834]
[clojure.lang.LazySeq sval "LazySeq.java" 42]
[clojure.lang.LazySeq seq "LazySeq.java" 51]
[clojure.lang.RT seq "RT.java" 535]
[clojure.core$seq__5467 invokeStatic "core.clj" 139]
[clojure.core$print_sequential invokeStatic "core_print.clj" 53]
[...]
所以,这可能是您使用的Clojure工具出于某种原因将其从您那里隐藏起来了(在这种情况下,了解您执行以不获得堆栈跟踪的确切步骤将非常有帮助),或者您没有在正确的位置寻找。
假设您指的是堆栈跟踪似乎指向您调用filter
的位置之外 - 这是因为filter
实际上并没有过滤任何内容,它创建了一个在迭代时过滤内容的懒序列。因此,堆栈跟踪可能不包括调用filter
的地方,但会包括创建的懒序列被实现的地方。