«Проверка нулевой переменной» в строке - PullRequest
1 голос
/ 15 сентября 2011

Как правило, существует ли разница между

if("x".equalsIgnoreCase(myStrVar))

и

if(myStrVar.equalsIgnoreCase("x"))

в том, что первое не вызовет исключение нулевого указателя, но второе произойдет, если в обоих сценарияхmyStrVar равно нулю?

Ответы [ 5 ]

7 голосов
/ 15 сентября 2011

Да, это правильно. Однако это не означает, что вы всегда должны использовать прежнюю («безопасную») версию.

Если вы абсолютно уверены, что myStrVal не равно нулю - это означает, что для него значение null будет означать ошибку - я, вероятно, использовал бы вторую форму.

  • Я нахожу это более читабельным (так же, как я написал бы if (x == 0) вместо if (0 == x)
  • Если значение равно null, вероятно, лучше начинать как можно раньше, а не продолжать, находясь в неожиданном состоянии

Итак:

  • Если вы хотите, чтобы специальная обработка для myStrVal была нулевой, выполните проверку для этого первого
  • Если вы хотите, чтобы myStrVal был равен нулю так же, как и любое другое значение, отличное от "x", используйте первую форму
  • Если вы хотите рассматривать myStrVal как ноль как ошибку, используйте вторую форму
1 голос
/ 15 сентября 2011

Точно, потому что реализация

public boolean equalsIgnoreCase(String anotherString) {
    return (this == anotherString) ? true :
           (anotherString != null) && (anotherString.count == count) &&
           regionMatches(true, 0, anotherString, 0, count);
}

Это хороший пример правила (условия Йоды-): «Вы должны начинать с константы, чтобы избежать разыменования нулевых указателей».

1 голос
/ 15 сентября 2011

Ваше утверждение, что вторая версия вызовет NullPointerException, а первая - нет, является правильным.

1 голос
/ 15 сентября 2011

Очевидно, что NullPointerException будет поднят во втором сценарии, если myStrVar == null.Вы не можете вызвать equalsIgnoreCase(String str) на null, но вы можете передать null в качестве аргумента.

1 голос
/ 15 сентября 2011

Если я правильно понял ваш вопрос, ответ «да». :)

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