Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure.lang.Reflector.invokeInstanceMethod中的NPE仅在某些情况下可用_Clojure_Clojure Java Interop - Fatal编程技术网

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

clojure.lang.Reflector.invokeInstanceMethod中的NPE仅在某些情况下可用,clojure,clojure-java-interop,Clojure,Clojure Java Interop,我在Java互操作方面遇到了一个奇怪的问题。我围绕BDB JE API编写了一个小型专用包装器。当我在repl(苹果酒repl)中时,一切正常:我可以打开数据库、添加条目等。但是如果我从应用程序中的另一个函数调用添加记录函数,我会得到一个NPE NullPointerException clojure.lang.Reflector.invokeInstanceMethod (Reflector.java:26) 我开始觉得我疯了。这将打开数据库: (defn opendb [envpath

我在Java互操作方面遇到了一个奇怪的问题。我围绕BDB JE API编写了一个小型专用包装器。当我在repl(苹果酒repl)中时,一切正常:我可以打开数据库、添加条目等。但是如果我从应用程序中的另一个函数调用添加记录函数,我会得到一个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}))
下面是添加记录的

(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记录中添加了
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)

正如我所说,这对我来说毫无意义,但完全是可复制的。

你能发布stacktrace吗?我将stacktrace添加到原始文件中。
k
v
(:数据库dbm)
中的一个为零。堆栈跟踪中的行号应该告诉您是哪一个。假设异常来自
invokeInstanceMethod
(:database dbm)
是nil,但正如我在问题中所说,我在调用
put
之前添加了
prn
调用,并且所有值都不是nil。这就是为什么我不明白发生了什么!这对我来说毫无意义。从你的描述来看,这确实很奇怪。您使用的是什么版本的Clojure?有没有什么方法可以提供一个自包含的示例来显示该行为,并将其放到github repo中?