Почему этот оператор if не замыкается?

В настоящее время я исправляю ошибку в чужом коде Java, но не могу объяснить эту ошибку. Рассматриваемый код представляет собой следующий оператор if:

if (locked && DEBUG_ENABLED
    && owner != null 
    && (owner.equals(playerName) || subowner.equals(playerName))
    && handleCommand(playerName, message)) {
    ....
 } else {
    ....
 }

В котором DEBUG_ENABLED инициализируется как private static boolean DEBUG_ENABLED = false;, а handleCommand работает следующим образом:

public boolean handleCommand(String name, String msg) {
    if(msg.equals("Command1")) {
        ....
    } else if(msg.equals("Command2")) {
        ....
    } ....
    } else {    // No matching command
        return false;
    }
    return true;
}

Что меня озадачивает, так это то, что хотя DEBUG_ENABLED установлено значение false, код все еще вызывает и выполняет функцию handleCommand. Я всегда думал, что это не должно происходить из-за короткого замыкания. Сам if-оператор в сумме по-прежнему оценивается как ложный, так как выполняется только код внутри else-блока в первом фрагменте.

Итак, почему это выражение if ведет себя так? Это не короткое замыкание, или я неправильно понимаю принцип, или с этой частью кода что-то совсем другое не так? (Помимо отсутствующей проверки нуля для subowner, которая выполняется за пределами этой части.)


person user2757672    schedule 07.09.2013    source источник
comment
У меня короткое замыкание. Какая у вас версия Java? И вообще, DEBUG_ENABLED может быть true?   -  person Sotirios Delimanolis    schedule 08.09.2013
comment
Пожалуйста, опишите обстоятельства, в которых вы используете это, и насколько точно вы знаете, что это не короткое замыкание.   -  person Andrew Ring    schedule 08.09.2013
comment
У меня тоже короткое замыкание, вы на 100% уверены, что DEBUG_ENABLED == false?   -  person BackSlash    schedule 08.09.2013
comment
|| означает, что если subowner.equals возвращает true, handleCommand все равно необходимо проверить. Поскольку есть предложение ИЛИ, если одна сторона ложна, другую сторону все равно нужно проверить. DEBUG_ENABLED делает левую часть || ложной, но правая часть все еще может быть истинной.   -  person David Schwartz    schedule 08.09.2013
comment
Вау, быстрые ответы. Хм, у нас 1.6. Что касается отсутствия короткого замыкания, если в этой функции handleCommand найдено совпадение, она отображает некоторый текст или выполняет действие. Каждый раз при тестировании эти действия проверяются, а также действия в остальной части первого фрагмента. (Он не показывает какие-либо действия, выполняемые, если оператор if оценивается как true.)   -  person user2757672    schedule 08.09.2013
comment
Дэвид, я предположил, что () вокруг || изолировали его, и что общее состояние представляет собой серию &&. Я ошибаюсь в этом предположении?   -  person user2757672    schedule 08.09.2013


Ответы (1)


Невозможно, чтобы оператор && не замкнулся. Возможно, вы использовали &? Если нет, это означает, что вы сделали некоторые ложные предположения о том, что предыдущие условия перед последним были ложными.

person plalx    schedule 07.09.2013
comment
Этот первый фрагмент является прямой копией кода, как и инициализация. Я проверил, изменяется ли или локально объявляется ли DEBUG_ENABLED где-либо еще в коде, но это не так. Второй фрагмент был изменен, но только для того, чтобы сократить его и передать идею. - person user2757672; 08.09.2013
comment
@user2757672 user2757672 Не можете ли вы поставить точку останова в коде непосредственно на условии или непосредственно перед ним и проверить, что каждое условие оценивается как ложное? - person plalx; 08.09.2013
comment
Я могу подтвердить, что DEBUG_ENABLED ложно. Однако ваше предложение проверять каждое условие и то, что происходит, если оно ложно, интересно. Может быть, это подскажет мне, в чем причина этого. - person user2757672; 08.09.2013
comment
@user2757672 user2757672, если одно из условий оценивается как ложное перед последним условием, а оператор не замыкается, с интерпретатором что-то очень не так. Проверь себя, if (false && true && someFunction()) {} - person plalx; 08.09.2013