Groovy 链接空安全运算符

Groovy 链接空安全运算符,groovy,nullpointerexception,Groovy,Nullpointerexception,我的项目有如下代码: params.stringValue?.trim().replaceAll('aa', 'a') 我们希望如果params.stringValue为null,那么将不会调用trim()和replaceAll() 然而,我们在这一行得到了一个NullPointerException,表示不能对null对象调用replaceAll() 我们必须将代码更改为这样: params.stringValue?.trim()?.replaceAll('aa', 'a') 为什么上面的

我的项目有如下代码:

params.stringValue?.trim().replaceAll('aa', 'a')
我们希望如果
params.stringValue
为null,那么将不会调用
trim()
replaceAll()

然而,我们在这一行得到了一个
NullPointerException
,表示不能对null对象调用
replaceAll()

我们必须将代码更改为这样:

params.stringValue?.trim()?.replaceAll('aa', 'a')

为什么上面的第一段代码不起作用?这是Groovy中的一个bug,它在遇到一次null之后继续计算表达式吗?

这确实是Groovy的工作方式,并且已经咬到了:

println book?.author?.firstName?.trim().concat(“很棒”)

看着这行代码,我确信我不会受到任何鬼鬼祟祟的NullPointerException的影响。如果book、author或firstName为null,我只需打印null,而不必担心concat()方法。毕竟,如果trim()方法成功,那么将其结果设为null是没有意义的。这就是我错的地方

至少有人改变了这一点:

a?.b.c//你看到错误了吗?;)

我将得到一个NullPointerException。我是说,如果你用空保险箱?。链式表达式中的运算符, 您必须在所有属性中使用,因为如果您忘记在某个地方输入,您也会得到一个错误。会的 如果Groovy能够检测到?。运算符,并将其注入其他属性中,如果 它发现接线员失踪了。那么,如果你要打这个

a?.b?.e.f?.g//我忘了把。n“f”属性 a?.b.e.f.g

Groovy可以用一个真正的空安全表达式修复它,如下所示:

params.stringValue?.trim()?.replaceAll('aa', 'a')
a?b?e?f?g


我认为你的假设不正确。这:

params.stringValue?.trim().replaceAll('aa', 'a')
这并不意味着:

if(params.stringValue is null)
   dont proceed to trim() and replaceAll()
而是指:

if(params.stringValue is null)
   skip trim() without complain but pass null to replaceAll()
所以你需要说:

params.stringValue?.trim()?.replaceAll('aa', 'a')

如果传入参数为null,则将跳过
trim()
replaceAll()

你的假设只是部分正确


-运算符在null的情况下不会中断执行,它会阻止调用当前方法,并返回一个
null
,这就是为什么还需要使用

保护链的右侧。我认为这是一个“特性”,而不是一个bug(!)另一个问题是类似于priceItemInstance?.activePriceItemDelta?.pricePerUnitList[i]的代码,您需要用priceItemInstance?.activePriceItemDelta?.pricePerUnitList?替换。getAt(i)是空安全的