使用 AOT 编译我的项目会抛出 NullPointerException

Compiling my project with AOT throws a NullPointerException

我正在尝试使用 lein uberjar 构建一个 uberjar。在编译期间,抛出以下内容:

Exception in thread "main" java.lang.NullPointerException, compiling:(/tmp/form-init8223412427040046857.clj:1:73)
    at clojure.lang.Compiler.load(Compiler.java:7391)
    at clojure.lang.Compiler.loadFile(Compiler.java:7317)
    at clojure.main$load_script.invokeStatic(main.clj:275)
    at clojure.main$init_opt.invokeStatic(main.clj:277)
    at clojure.main$init_opt.invoke(main.clj:277)
    at clojure.main$initialize.invokeStatic(main.clj:308)
    at clojure.main$null_opt.invokeStatic(main.clj:342)
    at clojure.main$null_opt.invoke(main.clj:339)
    at clojure.main$main.invokeStatic(main.clj:421)
    at clojure.main$main.doInvoke(main.clj:384)
    at clojure.lang.RestFn.invoke(RestFn.java:421)
    at clojure.lang.Var.invoke(Var.java:383)
    at clojure.lang.AFn.applyToHelper(AFn.java:156)
    at clojure.lang.Var.applyTo(Var.java:700)
    at clojure.main.main(main.java:37)
Caused by: java.lang.NullPointerException
    at clojure.string$lower_case.invokeStatic(string.clj:217)
    at clojure.string$lower_case.invoke(string.clj:213)
    at kappa.joke_classifier$is_jokable_QMARK_.invokeStatic(joke_classifier.clj:32)
    at kappa.joke_classifier$is_jokable_QMARK_.invoke(joke_classifier.clj:29)
    at kappa.core$maybe_joke.invokeStatic(core.clj:47)
    at kappa.core$maybe_joke.invoke(core.clj:45)
    at clojure.core$run_BANG_$fn__7276.invoke(core.clj:7393)
    at clojure.lang.PersistentVector.reduce(PersistentVector.java:341)
    at clojure.core$reduce.invokeStatic(core.clj:6544)
    at clojure.core$run_BANG_.invokeStatic(core.clj:7388)
    at clojure.core$run_BANG_.invoke(core.clj:7388)
    at kappa.core$run.invokeStatic(core.clj:58)
    at kappa.core$run.invoke(core.clj:53)
    at kappa.core$_main.invokeStatic(core.clj:66)
    at kappa.core$_main.doInvoke(core.clj:61)
    at clojure.lang.RestFn.invoke(RestFn.java:397)
    at clojure.lang.Var.invoke(Var.java:375)
    at user$eval5.invokeStatic(form-init8223412427040046857.clj:1)
    at user$eval5.invoke(form-init8223412427040046857.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6927)
    at clojure.lang.Compiler.eval(Compiler.java:6917)
    at clojure.lang.Compiler.load(Compiler.java:7379)
    ... 14 more

使用 string/lower-case 的代码如下所示:

(defn is-jokable? [msg]
  (and
    (> 30 (count msg))
    (= :positive (.classify classifier (str/lower-case msg)))
    (< 1 (:positive (.probabilities classifier (str/lower-case msg))))))

从堆栈跟踪可以看出,我的-main函数调用了一个最终调用is-jokable的函数,而str/lower-case似乎是用nil调用的。如果我理解正确的话,这是因为 uberjars 发生了 AOT 编译,但我不太确定为什么会出现这个问题......我已经尝试阅读 AOT,但没有找到任何有用的信息。你能给我解释一下 AOT 的内部工作原理吗?

我都不好意思发帖了,一定是晚上太晚了……;)

我完全被堆栈跟踪中的 compilinginvokeStatic 提示分散了注意力,现在才发现这确实是一个日常错误,我希望地图包含 key/value 对不存在,导致 nil 被传递给有问题的函数。

感谢您的宝贵意见!