2013-02-19 2 views
2

Я обнаружил при дебюте моего приложения для Android странное поведение.Почему Boolean TRUE не является ИСТИННЫМ?

Существует выражение:

if (r == true) 

где вар r имеет значение true, но все заявление является ложным. Я пытаюсь использовать объект Boolean, а также примитивный тип boolean.

Уверен, что я делаю некоторые основные ошибки.

Вот экран от debbuger.

enter image description here

Edit:

Я использую java.lang.Boolean.

метод isSyncRequired возвращает Boolean.TRUE и сравнивается в блоке if-else.

if(isSyncRequired(s)) 
if (r) 
if (r == true) 

dont't work.

+0

Я забыл ... Я также пытаюсь оператор ', если (г)'. – misco

+0

Из-за любопытства, почему вы просто не делаете: «if (isSyncRequired (s))» или даже «if (r)», вы теперь сравниваете логическое значение, чтобы убедиться, что оно истинно, в то время как вы можете просто использовать само значение , И при использовании Boolean use equals not == –

+0

Я сначала использую 'if (isSyncRequired (s)), но приложение получило странное поведение. Затем я начинаю искать ошибку. Я меняю его на 'if (r)' позже на 'if (r == true)' и т. Д. – misco

ответ

11

Потому что вы используете капитал-B Boolean, который является объектом, поэтому == использует ссылочную семантику равенства.

То, что вы должны делать это только

if (r) 

Там нет необходимости, чтобы проверить, если он равен верно. Или в строке:

if (isSyncRequired(s)) { 
+2

Ваше обоснование, похоже, не согласуется с [секцией JLS по логическому равенству] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.21.2) , Согласно JLS, перед сравнением перед распаковкой следует распаковать 'r'. Возможно, это что-то особенное для Android? – thkala

+0

Я различаю разницу между объектом и примитивом. Но ваше предложение не работает. – misco

+0

Я согласен, но проблема OP однозначно указывает на то, что в их сценарии не работает. –

1

== сравнивает ссылки. Вы сравниваете объект Boolean с значением boolean.

Использовать вместо if (r).

1

Необходимо удалить значение Boolean. Попробуйте

if (r.booleanValue()) 

или

if (r.booleanValue() == true) 
Смежные вопросы