Сегодня я встретил исключение в нашем коде, где trim()
выдает NPE, когда делает что-то вроде someString?.toLowerCase().trim()
. Это вызвало у меня любопытство, так как у меня сложилось впечатление, что безопасная навигационная операция сорвется сразу после null
, а не будет продолжать звонить по цепочке. Так что возиться немного в командной строке заводной ...
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
имеет значение null, так что, если что-нибудь, NPE должен быть брошен b
, но для этого есть безопасная операция навигации. Я ожидал бы, что выполнение остановится в этой точке и вернет null
в var2
, но вместо этого кажется, что null
передается через b
, вызывая c
для NPE.
Правильно ли здесь мое понимание безопасной операции навигации или это ошибка в Groovy? Спасибо, ребята!