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 发布

Gunнар,在你的例子中,方法 'someMethod' 声明为返回 void,还是其他什么?在你的例子中添加这个信息可能会帮助澄清它。

0

评论由:wagjo 发布

Gunнар,第二个例子是模糊不清的,转移了讨论的主题。无论如何,无论是通过本地方法返回错误类型,还是不通过,这都是最初的用户错误。目前,这是在运行时报告的。对我来说,这个工单应该是一项次要增强,而不是缺陷。

0

评论者:gv

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

Andy,是的 'someMethod' 声明为返回 void。我会编辑原始工单文本,添加示例和Java方法返回值信息,但似乎是jira不允许这么做。

0

评论者:alexmiller

我在描述中添加了第二个示例(带有澄清的空指针异常注释)。

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