2013-09-07 5 views
2

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

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 установлен в ложь , код по-прежнему вызывает и выполняет функцию handleCommand. Я всегда думал, что этого не должно произойти из-за короткого замыкания. Сам оператор if в итоге по-прежнему оценивается как false, поскольку выполняется только код внутри else-блока в первом фрагменте.

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

+0

Это короткое замыкание для меня. На какой версии Java вы работаете? И все равно, что 'DEBUG_ENABLED' может быть« истинным »? –

+0

Опишите обстоятельства, в которых вы работаете, и как точно вы знаете, что это не короткое замыкание. – aring

+0

Это слишком короткое замыкание для меня, вы на 100% уверены, что 'DEBUG_ENABLED == false'? – BackSlash

ответ

1

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

+0

Этот первый фрагмент является прямой копией кода, как и инициализация. Я проверил, если «DEBUG_ENABLED» модифицируется или локально объявляется каким-либо образом в другом месте кода, но это не так. Второй фрагмент был изменен, но только для того, чтобы сократить его, получив эту идею. – user2757672

+0

@ user2757672 Не можете ли вы поставить точку останова в коде непосредственно на условие или непосредственно перед этим и проверить, что все условия оцениваются как false? – plalx

+0

Я могу подтвердить, что 'DEBUG_ENABLED' является ложным. Тем не менее, ваше предложение проверить каждое условие и что происходит, если они ложные, интересно. Может быть, это скажет мне, что вызывает это. – user2757672

Смежные вопросы