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

时间:2016-04-18 23:50:50

标签: java clojure leiningen

我正在尝试使用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

使用字符串/小写的代码如下所示:

(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的内部运作吗?

1 个答案:

答案 0 :(得分:0)

我差点尴尬我发布了这个,它一定是在深夜......;)

我完全分心了堆栈跟踪中的compilinginvokeStatic提示,现在发现这确实是一个日常错误,我希望地图包含一个键/值对不存在,导致nil被传递给相关函数。

感谢您提供的有用评论!