请在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为null。

我期望在生成"return null.doubleValue();"时的编译器点进行检查,然后显示错误信息,例如"期望原始返回值为double类型,但没有返回值。"

0

评论者:wagjo

在我看来,您的第二个例子看起来是完美的,编译器不应该报告任何错误,空指针检查必须在运行时进行。

0

由: gv评论

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

0

评论者:jafingerhut

高纳,在您的例子中,方法 'someMethod' 是否声明为返回 void,还是其他什么?将此信息添加到您的例子中可能有助于澄清。

0

评论者:wagjo

高纳,第二个例子含糊不清且偏离了讨论。无论如何,无论是通过原生方法返回错误类型还是不通过原生方法返回,它首先都是用户错误。到目前为止,它是在运行时报告的。对我来说,这个票据应该是一个小的增强,而不是缺陷。

0

由: gv评论

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

安迪,是的 'someMethod' 声明为返回 void。我将编辑原始票据文本来添加示例和 Java 方法返回值信息,但看起来 jira 不让我这么做。

0

由: alexmiller评论

我在描述中添加了第二个例子(带有清晰的注释)。

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