2012-04-04 2 views
3

Можно создать дубликат:
A better way to compare Strings which could be nullСтрока сравнениях в Java

У меня есть, если условие, которое выглядит следующим образом:

if(!str1.equals(str2)) 
{ 
    --- 
    --- 
    --- 
} 

где str1 и str2 две строковые объекты ,

Есть вероятность, что str1 может быть нулевым, так же как и приведенный ниже код, эквивалентный приведенному выше, а также обработка нулевой проверки?

if(!(str1==null ? str2==null : str1.equals(str2))) 
{ 
    --- 
    --- 
    --- 
} 

Спасибо!

+0

Зависит от того, как вы представляете, что нулевая проверка обрабатывается в бит кода, который находится прямо у вас в голове. –

+0

Если 'str1' является' null', то если вы будете делать 'str1.equals();' вы получите 'NullPointerException'. Подробнее см. Http://stackoverflow.com/questions/2601978/how-to-check-if-my-string-is-equal-to-null – Vyoma

+0

Ваше состояние выглядит хорошо. Вы можете переписать его как 'if (str1 == null? Str2! = Null:! Str1.equals (str2))', который может быть проще читать. – NullUserException

ответ

4

Да, это приведет к такому же результату.

Чтобы быть немного более конкретно:

  1. Если str1не нуля, это точно то же самое, так как он просто проходит через тройную проверку с тем же выражением, как и до
  2. Если str1is null, тогда будет проверка, если str2 is также null.

И так как у вас есть полное тернарное выражение, обернутое фронтом !, которое ведет себя так же, как раньше.

Если вы хотите быть немного более ясным, вы могли бы сделать str2==null в реальное сравнение между str1 и str2: str1==str2. Поскольку одно из значений уже null, не имеет значения, что это референтная проверка вместо правильной проверки равенства строк и в конечном итоге становится более понятной в коде (для меня, так или иначе)

Как и другие отметили, однако, что библиотека Apache Commons уже включает в себя эту нуль-безопасную возможность равенства, но для этого требуется довольно существенное включение библиотеки. С другой стороны, многие считают, что функциональность Apache Commons должна эффективно рассматриваться как часть самой Java, поэтому вы можете сами решить, хотите ли вы дополнительной зависимости.

Наконец, функциональность не технически эквивалентны, так как метод по умолчанию .equals() выбросит NullPointerException, в то время как ваш код проверки равенства не будет. Если это то поведение, которое вы искали (я полагаю, что это так), тогда вы в порядке, но это то, о чем нужно знать.

5

Предполагая, что вы хотите, чтобы два нуля равны, конечно. В зависимости от вашего метода NullPointerException может быть правильным ответом. Вы можете сэкономить много печатать, получая знать

org.apache.commons.lang.StringUtils 

!StringUtils.equals(str1, str2); обрабатывает аннулирует для вас таким же образом.

+0

Apache string utils может быть огромной помощью для любого проекта, зачем изобретать колесо! –

+0

+1 для того, чтобы предлагать apache commons StringUtils, прежде чем я туда доберусь. StringUtils очень полезен для такого рода вещей, сравнения, которые корректно обрабатывают нули. –

+1

Он также может представить большую зависимость, когда достаточно небольшого количества кода ... – maerics

1

Использование тернарного оператора - это действительно глупый способ выполнить эту проверку, и это затрудняет чтение. Просто используйте И.

if(str1 != null && !str1.equals(str2)) 
{ 
    --- 
    --- 
    --- 
} 

Вам не нужно импортировать всю новую библиотеку для выполнения нулевой проверки.

+0

+1 amen для здравого смысла простого решения вместо использования библиотеки ... – maerics

+2

Это не проверяет, не является ли 'str2 'равно (т.е. null == null) на' str1'. Вместо этого этот код говорит, что если 'str1 == null', то он _can't_ будет равен' str2'. Этот ответ также не отвечает на вопрос о том, равны ли два варианта. – cdeszaq

+0

@cdeszaq OP хочет перейти в оператор if, если str1 и str2 не равны. Это то, что делает его самое первое утверждение. Весь этот код гарантирует, что str1 также _not_ null. Вы заметите, что если вы перечитаете сообщение, OP не касается str2, равным нулю. –

2

Это выглядит правильно, если вы считаете null s равным, и разрешите str2 быть null. Но было бы лучше, если бы вы никому не поверили, но напишите тест на все возможные случаи.

5

Если вы используете Java 7:

java.util.Objects.equals(str1, str2); 
0

Да, ваш код будет ввести if блок только если строки не равны (или только один из них является нулевым или оба из них не являются недействительными и другой).

Другой способ сделать это

if((str1 == null && str2 != null) || !str1.equals(str2)){ 
    // Only executes when strings are unequal 
} 

Это дело вкуса, некоторые люди имеют аллергию на троичных операторов. (Они мне нравятся).