2015-06-16 2 views
3

Мне нужно иметь возможность сравнивать две переменные, которые иногда могут быть нулевыми. Если они оба равны нулю, я все равно хочу, чтобы это считалось равным. Есть ли подходящий способ сделать это?java - Как сравнить два объекта, которые могут быть пустыми?

Я тестировал его в NetBeans и смотрел документацию на .equals() и видел, что нулевые ссылки ведут себя странно.

Это мои примеры и результаты:

Object a = null, b = null; 
System.out.println(a == b); 

возвращает TRUE.

ИЛИ:

System.out.println(a.equals(b)); 

бросает NullPointerException.

Работает ли я так, как я этого хочу в этом случае, или мне просто «повезет» здесь, и он пришел к выводу «правда» по какой-то другой причине?

Ошибка NullPointerException также меня сбивает с толку, так как я всегда понимал метод equals объекта как ссылочное равенство. В документации неоднократно указывается «ненулевые» объекты, но почему это имеет значение для сравнения ссылок? Любые разъяснения были бы весьма признательны.

+8

Objects.equals (a, b); – null

+3

Объекты не 'null'. Вам нужно начать дифференцирование между переменными, ссылками и объектами. –

+1

@OP: Ответы, которые вы получили, помогут вам понять, что пошло не так. Но после того, как вы все это поймете, вы захотите обратить внимание на то, что предложил Гильберт, и именно этого вы и добились. – sstan

ответ

9

Оператор == проверяет, имеют ли две переменные одинаковое значение. Для ссылок на объекты это означает, что переменные должны ссылаться на один и тот же объект (или обе переменные должны быть null). Разумеется, для метода equals() требуется, чтобы переменная, на которую она была вызвана, не была null. Это поведение зависит от типа объекта, на который делается ссылка (на фактический объект, а не на объявленный тип). Поведение по умолчанию (заданное Object) - это просто использовать ==.

Чтобы получить поведение, которое вы хотите, вы можете сделать:

System.out.println(a == null ? b == null : a.equals(b)); 

Примечание: по состоянию на Java 7, вы можете использовать:

System.out.println(java.util.Objects.equals(a, b)); 

, который делает то же самое внутри.

0

a.equals(b) возвращает NullPointerException, потому что это буквально

null.equals(...)

и нуль не имеют .equals (или любой другой метод).

То же самое с b.equals(a)

a == b возвращает истину, потому что это null == null (очевидно, верно). Так что сравнивать нужно проверить a и b для нулевой или что-то вроде ...

if (a != null) 
    return a.equals(b); // This works because a is not null. `a.equals(null)` is valid. 
else if (b != null) 
    return b.equals(a); // a is null, but b is not 
else 
    return a == b; 

Оператор?: Немного более кратким для этого

+0

Я не думаю, что вам нужно протестировать «b! = Null». Все, что вам нужно в этот момент, это вернуть 'true', если' b == null'. Никакая разумная реализация 'equals()' не вернет 'true', если аргумент' null' (и 'a' _must_ будет' null' в этой ветке). Если это так, тогда ему придется возвращать 'true' для всех аргументов, так как контракт для' Object # equals' заключается в том, что он должен реализовать отношение эквивалентности. –

+0

Да, согласился. Я написал дополнительный пример if для полноты в моем примере ... даже если это посторонний – Shaun

1

Вы не можете вызвать метод как равные на нулевое значение ,Если вы хотите использовать метод saftly, вы должны проверить нулевое значение, например

if(a!=null) 
    System.out.println(a.equals(b)); 
else 
    System.out.println(a==b)); 
Смежные вопросы