Java null.equals(объект o)
Я знаю, что невозможно вызвать метод equals на нулевом объекте, подобном этому:
//NOT WORKING
String s1 = null;
String s2 = null;
if(s1.equals(s2))
{
System.out.println("NOT WORKING :'(");
}
Но в моем случае я хочу сравнить два объекта из двух баз данных, и эти два объекта могут иметь атрибуты null...
Итак, каков метод сравнения двух атрибутов, зная, что мы не уверены, что значение равно null или заполнено.
Этот метод хорош или нет?
//WORKING
String s1 = "test";
String s2 = "test";
if(s1 == s2 || s1.equals(s2))
{
System.out.println("WORKING :)");
}
//WORKING
String s1 = null;
String s2 = null;
if(s1 == s2 || s1.equals(s2))
{
System.out.println("WORKING :)");
}
Я не уверен, потому что в этом случае он не работает...:
//NOT WORKING
String s1 = null;
String s2 = null;
if(s1.equals(s2)|| s1 == s2 )
{
System.out.println("NOT WORKING :'''(");
}
Ответы
Ответ 1
Обычно я использую статическую служебную функцию, которую я написал с именем equalsWithNulls
, чтобы решить эту проблему:
class MyUtils {
public static final boolean equalsWithNulls(Object a, Object b) {
if (a==b) return true;
if ((a==null)||(b==null)) return false;
return a.equals(b);
}
}
Использование:
if (MyUtils.equalsWithNulls(s1,s2)) {
// do stuff
}
Преимущества такого подхода:
- Завершает сложность теста полного равенства в одном вызове функции. Я думаю, что это намного лучше, чем внедрять в ваш код множество сложных логических тестов каждый раз, когда вы это делаете. В результате он значительно реже приводит к ошибкам.
- Делает ваш код более наглядным и, следовательно, его легче читать.
- Явным образом упоминая нули в имени метода, вы передаете читателю, что они должны помнить, что один или оба аргумента могут быть пустыми.
- Сначала выполняется (a == b) тест (оптимизация, которая позволяет избежать вызова a.equals(b) в довольно распространенном случае, когда a и b не являются нулевыми, но относятся к точному одному и тому же объекту)
Ответ 2
Вам нужно будет проверить, что по крайней мере один из них не равен нулю, прежде чем принимать метод equals -
if(s1 == s2 || (s1!=null && s1.equals(s2))) {
System.out.println("WORKING :)");
}
здесь s1==s2
будет работать с null==null
. Но если даже один не является нулевым, вам нужно проверить atleast s1, прежде чем делать равные.
Обновление:
Как отредактировано @'bernard paulus', если вы используете Java 7, вы можете использовать java.util.Objects.equals(Object, Object)
Ответ 3
Другой вариант использования:
Objects.equals(identification, criteria.getIdentification())
java.util.Objects
Этот класс состоит из статических методов утилиты для работы на объекты. Эти утилиты включают нулевые или нулеустойчивые методы для вычисления хеш-кода объекта, возвращая строку для объект и сравнение двух объектов.
С: 1.7
public static boolean equals (Object a, Object b)
Возвращает true, если аргументы равны друг другу, а false в противном случае. Следовательно, если оба аргумента равны нулю, возвращается true и если точно один аргумент равен null, возвращается false. В противном случае, равенство определяется с использованием метода равных первого аргумент.
Ответ 4
Попробуйте использовать класс ObjectUtils из org.apache.commons.lang
public static boolean equals(java.lang.Object object1,
java.lang.Object object2)
Из api docs...
Сравнивает два объекта для равенства, где один или оба объекта могут быть нулевыми.
ObjectUtils.equals(null, null) = true
ObjectUtils.equals(null, "") = false
ObjectUtils.equals("", null) = false
ObjectUtils.equals( "," ") = true
ObjectUtils.equals(Boolean.TRUE, null) = false
ObjectUtils.equals(Boolean.TRUE, "true" ) = false
ObjectUtils.equals(Boolean.TRUE, Boolean.TRUE) = true
ObjectUtils.equals(Boolean.TRUE, Boolean.FALSE) = false
Ответ 5
Причина, по которой вы получаете исключение NullPointerException при выполнении s1.equals(s2)
с s1
как null, не из-за того, что s2 имеет значение null, а потому, что вы пытаетесь вызвать метод equals на s1, который является нулевым.
Попробуйте изменить его следующим образом:
if(s1 != null && s1.equals(s2){ /*...*/ }
Также обратите внимание, что если s1 не является нулевым и s2 является, вы получите false
обратно с равными, но не исключение NullPointerException.
Ответ 6
String s1 = null;
String s2 = null;
if(s1 != null && s2 != null && s1.equals(s2)) {
System.out.println("equals");
} else {
System.out.println("not equals");
}
Ответ 7
Я думаю, что вы сравниваете два объекта.
Итак, это должно быть как
if(s1==null & s2 == null) // both null but equal
return true;
else if(s1 != null && s2 != null && s1.equals(s2)) // both not null and equal
return true;
else
return false;
True - для равных
False - для не равных
Ответ 8
Если вы хотите узнать, есть ли что-то "нуль", вы можете сравнить с помощью:
if(s1==null)
Если он равен нулю, он скажет вам правду. Проблема, если у вас есть String, которая равна null, вы не можете использовать методы equals(). По этой причине ваша третья часть не работает, потому что, если она равна, вы не можете использовать нулевой указатель.
Сначала вы должны проверить, является ли объект нулевым, а затем, если он не равен нулю, методы равны.
С другой стороны, будьте осторожны, потому что, возможно, вы хотите сравнить пустую строку, в этом случае вы должны использовать равную (""). Если вы хотите сравнить пустую строку, лучше, чтобы вы положили сначала пустую строку следующим образом:
"".equals(YourStringNotNull);
Извините за мой английский. Надеюсь, это вам поможет.
Ответ 9
Вызов оператора точки (метод вызова или свойства объекта) на нулевом объекте будет всегда throw RuntimeException (Исключение) являются статическими членами, так как они не принадлежат объекту но классу).
Блок кода работает только потому, что || является оператором быстрого доступа:
String s1 = null;
String s2 = null;
if(s1 == s2 || s1.equals(s2))
он не оценивает правую сторону, если левая сторона верна.
То же самое для & &: он не оценивает правую сторону, если левая сторона является ложной.