2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅关于页面,了解更多关于它的工作原理的信息。

0
错误

今天重新编译时遇到了这个古怪的问题:当使用 (filter zero? [:hi]) 时,会引发一个 java.lang.ClassCastException,没有合适的堆栈跟踪。

我正在使用 Clojure 版本 1.11.1.1347。

1 答案

+1

已被选为最佳答案
 
最佳答案

标题有误导性 - 这里没有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]
[...]

因此,似乎要么是你使用的工具出于某种原因隐去了它(在这种情况下,知道您如何执行才能不获得堆栈跟踪将很有帮助),要么是您没有看对地方。

如果你认为堆栈跟踪似乎是指向您调用 filter 的地方 - 那是因为 filter 实际上不会过滤任何东西,它创建了一个惰性序列,在迭代时会过滤掉元素。因此,堆栈跟踪可能不会包括调用 filter 的位置,但会包括结果惰性序列的实现位置。

by
很抱歉,我在 Emacs REPL 和终端使用了不同的 Clojure 版本。错误实际上是由版本 1.10.0 产生的,升级到 1.11.1 后行为有了很大的改善,并有了合适的堆栈跟踪。(我说空指针错误是因为在 REPL 中评估表达式时它只打印了 "null",对此造成的误解表示歉意)。
...