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的原因要困难得多,因为您首先会怀疑objnull

我期望在发出“return null.doubleValue();”的地方进行编译器检查,然后显示错误消息,例如:“期望基本返回值类型'double',但没有返回值。”。

0

评论者:wagjo

在我看来,您的第二个示例完全没问题,编译器不应报告任何错误,NPE检查必须在运行时进行。

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

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

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