Проверьте ли Java все аргументы в операторе «&&» (и), даже если один из них ложный?

StackOverflow https://stackoverflow.com/questions/4163742

Вопрос

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

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

Предположим, что объект - это нулевой.

Выполняется ли этот код в NullPointerException или только если утверждение не будет выполнено?

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

Это было полезно?

Решение

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

Другие советы

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

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

&& - http://ideone.com/lvv6w. & - http://ideone.com/x5pdu.

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

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

Ответ заключается в том, что Java не будет выполнять тело «IF».

Это не будет бросать NullPointerException Отказ Состояние будет оценено слева направо и в тот момент false Выражение обнаружено, что он не оценивает оставшееся выражение.

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

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

...

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

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

1

Так что ответ на ваш вопрос - «нет».

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

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

У Java есть оценка короткого замыкания, поэтому все будет хорошо.

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

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

&& и || Условия останавливаются в точке, они могут решить, является ли условие true / false, в вашем случае условие остановится сразу после object != null И я думаю, что ваш код просто в порядке для этого случая

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top