Проверяет ли Java все аргументы в операторе "&&" (и), даже если один из них имеет значение false? - PullRequest
13 голосов
/ 12 ноября 2010

У меня есть такой код:

if(object != null && object.field != null){
    object.field = "foo";
}

Предположим, что объект является нулевым.

Результатом этого кода является исключение nullPointerException или просто, если оператор не будет выполнен?

Если это произойдет, как сделать этот код более элегантным (если это возможно, конечно, возможно)?

Ответы [ 10 ]

20 голосов
/ 12 ноября 2010

&& делает короткое замыкание, в то время как & не будет.

Но с такими простыми вопросами лучше просто попробовать (Ideone может помочь, когда у вас нет доступа к машине).

&& - http://ideone.com/LvV6w & - http://ideone.com/X5PdU

Наконец, место для проверки наверняка будет JLS §15.23 .Не самая простая вещь для чтения, соответствующий раздел гласит: Оператор && похож на & ( §15.22.2 ), но оценивает его правый операнд, только если значение его левогоручной операнд истинен.

9 голосов
/ 12 ноября 2010

Java имеет оценку короткого замыкания, т. Е. Ваш код должен быть в порядке

2 голосов
/ 12 ноября 2010

Может быть, этот другой вопрос поможет вам:

Различия в логических операторах: & vs && и | против ||

2 голосов
/ 12 ноября 2010

Один из способов узнать это! Попробуй это! Как? Хорошо, создайте метод, который печатает что-то:

public static boolean test(int i)
{
    System.out.println(i);
    return false;
}

...

if (test(1) && test(2) && test(3))
{
    // not reached
}

Это печатает:

1

Итак, ответ на ваш вопрос "нет".

2 голосов
/ 12 ноября 2010

Это не будет выбрасывать NullPointerException.Условие будет оцениваться слева направо и в тот момент, когда будет найдено первое false выражение, оно не будет оценивать оставшееся выражение.

2 голосов
/ 12 ноября 2010

Лучший способ выяснить это - попробовать, особенно для однострочного вопроса.Было бы быстрее, тоже.

Ответ в том, что Java не будет выполнять тело "если".

1 голос
/ 12 ноября 2010

&& и ||условия прекращаются в тот момент, когда они могут решить, является ли условие истинным / ложным, в вашем случае условие остановится сразу после object != null, и я думаю, что ваш код подходит для этого случая

1 голос
/ 12 ноября 2010

Java имеет оценку короткого замыкания, так что все будет в порядке.

Код выглядит нормально для меня, но нужно ли проверять object.field != null? Я думаю, что тест может быть опущен, так как вы никогда не используете переменную, просто установите ее.

Кстати, большинство программистов обращаются к полям напрямую (object.field), а не через методы получения / установки (object.setField(x);). Без дальнейшего контекста я не могу сказать, подходит ли это в вашем случае.

0 голосов
/ 12 ноября 2010

Хотя здесь работает короткое замыкание, это не гарантия того, что (как я это делал много раз) вы ошибетесь в порядке при написании другого, было бы лучше использовать вложенные операторы if и определить порядок, который вы хотителогическая проверка на разрыв:

if(object != null) 
{
    if(object.field != null)
    {
        object.field = "foo";
    }
}

Это делает то же самое, что вы, по сути, говорите, если первая логическая проверка не пройдена, не выполняйте вторую;он также безопасен для nullPointerException, так как object.field не будет проверяться, если только объект не имеет значение null

Использование короткого замыкания на логических значениях может позже стать раздражающим, так как при наличии множественного оператора bool становится эффективнее отлаживатькакая часть замкнута.

0 голосов
/ 12 ноября 2010

Если вы хотите, чтобы все ваши логические выражения оценивались независимо от значения истинности каждого из них, вы можете использовать & и |вместо && и ||.Однако убедитесь, что вы используете их только в логических выражениях.В отличие от && и ||, & и |также имеют значение для числовых типов, которое полностью отличается от их значения для логических значений.http://ibiblio.org/java/course/week2/46.html

...