gpt4 book ai didi

groovy - Groovy 的安全导航运算符是否会出现这种与 NPE 相关的行为?

转载 作者:行者123 更新时间:2023-12-04 22:52:53 25 4
gpt4 key购买 nike

我今天在我们的代码中遇到了一个异常,其中 trim() 在执行类似 someString?.toLowerCase().trim() 的操作时抛出 NPE。这让我很好奇,因为我的印象是安全导航操作会在 null 上立即中断,而不是继续调用链中的东西。所以在命令行 groovy 中稍微修改一下......

groovy> def a = null
groovy> def getB = {
groovy> return 'b'
groovy> }
groovy> def getC = {
groovy> return 'c'
groovy> }
groovy> def var1 = a?.b?.c
groovy> var1

===> null

一切都很好,花花公子。但是删除了 b 上的安全导航操作,并且...

groovy> def a = null
groovy> def getB = {
groovy> return 'b'
groovy> }
groovy> def getC = {
groovy> return 'c'
groovy> }
groovy> def var2 = a?.b.c
groovy> var2
groovy> go
Caught: java.lang.NullPointerException: Cannot get property: c on null object
at CommandLine.run(CommandLine.groovy:10)

这是怎么回事? a 为空,因此如果有的话,NPE 应该由 b 抛出,但这就是安全导航操作的目的。我本来希望执行在此时停止并将 null 返回给 var2,但似乎 null 是通过 传递下来的b,导致 c 到 NPE。

我对安全导航操作的理解是错误的,还是这是 Groovy 中的错误?谢谢大家!

最佳答案

安全导航运算符不像 bool 表达式短路。它不属于整个表达式。它只保护紧挨着它的一个点引用。

对于这个例子:

a?.b.c

得到这个就对了:

java.lang.NullPointerException: Cannot get property: c on null object        at CommandLine.run(CommandLine.groovy:10)

发生的事情是,安全导航运算符按照表达式第一部分所宣传的那样工作,防止“a”变量出现可能的空值,从而防止对 a.anything 的任何引用出错NPE。因此,表达式的“a.b”部分被缩减为 null,我们现在有:

null.c

当然,当 Groovy 继续评估缺少问号意味着没有什么可以阻止它引发 NPE 时。

关于groovy - Groovy 的安全导航运算符是否会出现这种与 NPE 相关的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1604650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com