Ожидается ли такое поведение, связанное с NPE, для оператора безопасной навигации Groovy? - PullRequest
3 голосов
/ 22 октября 2009

Сегодня я встретил исключение в нашем коде, где 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? Спасибо, ребята!

1 Ответ

4 голосов
/ 22 октября 2009

Оператор безопасной навигации не похож на короткое замыкание логического выражения. Это не относится ко всему выражению. Он защищает только одну точечную ссылку рядом с ней.

Для этого примера:

a?.b.c

Правильно получить это:

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

То, что происходит, заключается в том, что оператор безопасной навигации работает так, как объявлено в первой части выражения, защищая от возможного значения NULL для переменной «a», и, таким образом, предотвращает любые ошибки на a.anything с ошибкой с помощью NPE. Итак, часть выражения «a.b» сведена к нулю, и теперь мы имеем:

null.c

и, конечно же, когда Groovy продолжает оценивать, что отсутствие знака вопроса означает, что ничто не мешает ему поднять NPE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...