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();"的地方进行检查,然后是错误消息,例如:"预期的原始返回值为'双精度'类型,但没有返回值。"

0

评论者:wagjo

我认为你的第二个示例看起来很正常,编译器不应该报错,并且 NPE 检查必须在运行时进行。

0

评论者:gv

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

0

评论者:jafingerhut

Gunnar,在你的示例中,方法 '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](https://clojure.atlassian.net/browse/CLJ-1432) (由 alex+import 报告)
...