仅在某些情况下,clojure.lang.Reflector.invokeInstanceMethod中的NPE

时间:2014-01-24 05:18:28

标签: clojure clojure-java-interop

我遇到了Java互操作的奇怪问题。我在BDB JE API周围写了一个小的专用包装器。当我在repl(cider-repl)时一切正常:我可以打开数据库,添加条目等等。但是如果我从我的应用程序中的另一个函数调用add-record函数,我得到一个NPE,

NullPointerException   clojure.lang.Reflector.invokeInstanceMethod (Reflector.java:26)

我开始认为我正在失去理智。这将打开数据库:

(defn opendb [envpath dbname]
  (let [envconf (.setAllowCreate (EnvironmentConfig.) true)
        env (Environment. (ensure-directory envpath) envconf)
        dbconf (-> (DatabaseConfig.) (.setAllowCreate true) (.setDeferredWrite true))
        database (.openDatabase env nil dbname dbconf)]
    {:environment env :database database}))

以下是add-record

(defn add-record [dbm k v]
  (let [key (DatabaseEntry. (.getBytes k "UTF-8"))
        value (DatabaseEntry. (.getBytes v "UTF-8"))]
    (.put (:database dbm) nil key value)))

这里真的没什么特别的。产生NPE的用法类似于

(let [cache (bdb/opendb "local-cache" "subject-map")]
  ;; do stuff
  (doseq [node (function "that returns a sequence of maps")]
    (bdb/add-record cache (:foo node) (:bar node)))
  (bdb/closedb cache))

我在bb / add-record中添加了prn S,所有值都是非nil,但我仍然获得了NPE。

这里发生了一些微妙的事情,它正在躲避我。有人有想法吗?

非常感谢。

编辑:这是完整的堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
    at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:26)
    at sterling.bdbje$add_record.invoke(bdbje.clj:33)
    at sterling.loaders$load_subject_batch.invoke(loaders.clj:214)
    at sterling.loaders$load_subject_headings.invoke(loaders.clj:224)
    at sterling.loaders$_main.doInvoke(loaders.clj:257)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at sterling.loaders.main(Unknown Source)

正如我所说,这对我来说毫无意义,但完全可以重现。

0 个答案:

没有答案