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)是空安全的