gpt4 book ai didi

java - 使用 reify 创建的一次性实例会导致 NPE

转载 作者:行者123 更新时间:2023-11-30 09:49:39 25 4
gpt4 key购买 nike

我正在尝试围绕如下所示的 Java API 编写 Clojure 层:

public class Executor {

public interface ExecutorJob<Result> {
public Result execute () throws Exception;
}

public static <R> R executeAsUser(RunAsWork<R> executorJob, String uid) {
try {
//...
R result = executorJob.execute();
return result;
}
finally {
//...
}
}

}

我的目标是创建一个 Clojure API,允许执行 fn 作为 ExecutorJob 的 execute 方法的主体。这是我想出的:

(defmacro execute-as
"Runs the form f while impersonating the given user"
[user f]
`(let [work# (reify Executor$ExecutorJob
(~'execute [~'this]
(~f)))]
(Executor/executeAsUser work# ~user)))

不幸的是,给出这个调用:

user> (macroexpand '(run-as "admin" (.println System/out "test")))
(let* [work__2928__auto__ (clojure.core/reify package.to.Executor$ExecutorJob (execute [this] ((.println System/out "test"))))] (package.to.Executor/executeAsUser work__2928__auto__ "admin"))

它会导致 NPE:

user> (execute-as "admin" (.println System/out "test"))

No message.
[Thrown class java.lang.NullPointerException]

Restarts:
0: [QUIT] Quit to the SLIME top level

Backtrace:
0: user$eval2936$reify__2937.doWork(NO_SOURCE_FILE:1)
1: package.to.Executor.executeAsUser(Executor.java:508)
2: user$eval2936.invoke(NO_SOURCE_FILE:1)
3: clojure.lang.Compiler.eval(Compiler.java:5424)
4: clojure.lang.Compiler.eval(Compiler.java:5391)
5: clojure.core$eval.invoke(core.clj:2382)
--more--

我尝试在 execute-as 第二个参数中放置一些有意义的 Java 调用,我可以看到使用调试器执行得很好。

那个宏有什么问题?

最佳答案

没关系,我明白了:我误用了宏参数并试图实际调用 f 形式的执行结果。它没有产生任何 yield ,因此是 NPE。

更正版本:

(defmacro execute-as
"Runs the form f while impersonating the given user"
[user f]
`(let [work# (reify Executor$ExecutorJob
(~'execute [~'this]
~f))]
(Executor/executeAsUser work# ~user)))

关于java - 使用 reify 创建的一次性实例会导致 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5692307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com