Короткозамкнутое поведение условного оператора OR (||)

Оба условных оператора && и || закорочены в соответствии с условиями http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html, что означает, что второй операнд не нужно оценивать время от времени.

Может ли кто-нибудь указать пример, в котором оператор условного OR (||) будет закорочен?

Короткозамкнутое поведение довольно просто с условным-AND (&) оператором, как в:

if (false && (1 > 0)), то второй операнд: (1 > 0) не нужно будет оценивать, но, похоже, не может найти/придумать пример для условного-ИЛИ.

Ответ 1

Оператор или коротко замыкается, когда первый операнд имеет значение true. Таким образом,

String foo = null;
if (true || foo.equals("")) {
    // ...
}

не выбрасывает NullPointerException.

Как @prajeesh справедливо указывает на комментарии, так как короткое замыкание используется в реальном коде, это предотвращать NullPointerException всякий раз, когда вы имеете дело с API, который может возвращать null. Например, если есть метод readStringFromConsole, который возвращает либо текущую доступную строку, либо null, если пользователь ничего не вводит, мы могли бы написать

String username = readStringFromConsole();
while (username == null || username.length() == 0) {
    // No NullPointerException on the while clause because the length() call
    // will only be made if username is not null

    System.out.println("Please enter a non-blank name");
    username = readStringFromConsole();
}

// Now do something useful with username, which is non-null and of nonzero length

В качестве примечания, API, который возвращает пользовательский ввод, должен возвращать пустую строку всякий раз, когда пользователь ничего не вводит и не должен возвращать значение null. Возвращение null - это способ сказать "нет ничего доступного", в то время как пустая строка - это способ сказать "пользователь ничего не вводил" и поэтому предпочтителен.

Ответ 2

if(true || (0 > 1))

Первое утверждение верно, поэтому нет необходимости оценивать второй.

Ответ 3

if (true || comparison)
Сравнение

никогда не будет оцениваться, так как его результат не имеет значения (поскольку первый аргумент уже истинен).