2024 Clojure状态调查!分享您的想法。

欢迎!请查看关于页面了解有关此信息。

0
编译器

以下最小示例显示了错误

(defn f ^double []) (f) => NullPointerException

在反编译函数f时,我发现以下返回表达式

return null.doubleValue();

这发生在Java互操作场景中,其中被调用的Java方法没有返回值,但位于原始Clojure函数的返回位置。
编译器应在编译时检查null

另一个示例 - 以没有返回值的void方法调用作为最后一个表达式失败,方式相似

(defn f ^double [^SomeClassToAvoidRuntimeReflection obj, x, y] (.someMethod obj, x, y)) (f obj, x, y) => NullPointerException

9 答案

0

由:alexmiller评论

在这种情况下,您期望发生什么?您已声明函数返回double,但没有返回值。

0

由:gv评论

由于这是一个最小示例,因此错误相对容易发现。
考虑以下具有Java互操作的小示例

(defn f ^double [^SomeClassToAvoidRuntimeReflection obj, x, y] (.someMethod obj, x, y)) (f obj, x, y) => NullPointerException

在这个例子中,找到NPE的原因要困难得多,因为您首先会怀疑obj为空。

我期望在 emitting "return null.doubleValue();" 的编译器点进行检查,随后显示错误消息,例如 "预期的原始返回值类型 'double',但没有返回值。"

0

评论人:wagjo

我认为您的第二个例子看起来完全没问题,编译器不会报告任何错误,空指针检查必须在运行时进行。

0

由:gv评论

@Jozef:不,您错了。编译器在编译时会通过反射推断被调用的方法不返回值,并发出"return null.doubleValue()"。因此,这应该并且在编译时报告为显式错误。我添加了一个类型提示,以使其明确没有运行时反射涉及。
如果编译器发出类似于"return somevar.doubleValue()"的东西,您就会是对的,因为那样在编译时就没有关于可能为"null"值的知识。

0

评论人:jafingerhut

根据您的例子,'someMethod' 方法声明为返回 void,还是其他类型?将此信息添加到您的示例中可能会澄清。

0

评论人:wagjo

Gunnar,第二个例子含糊不清,转移了讨论。无论如何,无论返回错误类型是通过本地方法还是其他方式,首先都是用户错误。现在它是运行时报告的。对我来说,这个任务应该是一个小的增强,而不是缺陷。

0

由:gv评论

是的,这是一个用户错误。但它比必要的更难调试。
此外,这显然是一个缺陷,因为发出'null.doubleValue()'不能被认为是有效的编译。

Andy,是的'someMethod'声明为返回 void。我会编辑原始任务文本以添加例子和 Java 方法返回值信息,但看起来 jira 不允许我这么做。

0

由:alexmiller评论

我在描述中添加了第二个示例(带有阐明性空注释)。

0
参考: https://clojure.atlassian.net/browse/CLJ-1432(由 alex+import 报告)
...