Netbeans Java Debugger утверждает, что ((true && false) == true)
Я только что столкнулся с чем-то, что бросает вызов моему пониманию логики. Как может произойти ситуация ниже?
![enter image description here]()
Я пробовал все обычные подходы к исправлению этого; чистить/строить, перезагружать netbeans и т.д., но проблема сохраняется. Переменная complete
всегда верна, независимо от того, что я делаю. Я даже заменил left
и right
на true
и false
логические значения соответственно, но никаких изменений. Что работало, рефакторинг переименовал переменную, но когда я сменил ее на оригинал, проблема снова возникла. Нет членов класса, которые называются одинаково.
Что происходит? Я, наконец, потерял рассудок, или если эта переменная имеет значение false
?
Это с Netbeans 7.3.1 в Windows.
Edit01
Я попытаюсь доказать это неверующим, что это происходит на самом деле, когда я получаю доступ к моему рабочему компьютеру через неделю или около того. В то же время, просто возьмите мое слово. ЭТО НЕ БЫЛО, и это не произошло из-за моего незнания отладки с Netbeans.
Я помню, что делал кучу команд переключения svn-copy, прежде чем это произошло, но не для проекта, где этот код находится в (зависимостях). В любом случае чистая/сборка должна была позаботиться о любых несоответствиях. Я также не забыл очистить кеш Netbeans, о котором я сейчас сожалею.
Edit02
Хаттеры будут ненавидеть, но, как я боялся, после возвращения на свою рабочую станцию, я больше не могу воспроизвести эту проблему. Меня это раздражает, признавая это, но у меня нет никаких доказательств того, что это когда-либо случалось. Все, что я сделал, это: разбудить мой компьютер из спящего режима, отключить рефакторинг переименовать мою переменную, что было последним, что я сделал до завершения моей работы, чистым/сборочным, а затем другим прогоном отладки. Все просто.. работает.
Ответы
Ответ 1
Я вижу пару возможностей, но я не верю, что это внутренне неправильно в JVM. Отладчик, вероятно, просто обманут или прослушивается.
-
Некоторая оптимизация происходит под капотом, что приводит к тому, что left
и complete
будут одной и той же переменной в стеке. Таким образом, это примерно означает, что ваш код был оптимизирован для этого:
boolean left = (start <= offset);
boolean right = (stop + 1 >= offset);
left = left && right; // reused "left" instead of new variable "complete"
Однако, насколько мне известно, компиляторы Java не выполняют такую оптимизацию. Может ли кто-нибудь подтвердить или предоставить детали, если это не так? (Может быть, javac или JIT делает это?)
-
Отладчик NetBeans действительно прослушивает. Из моего опыта отладки С++ на самом деле существовала ошибка в отладчике (звучит смешно, правильно), что приводит к тому, что отладчик не может правильно считывать целочисленные значения из памяти. Иногда результаты были отключены. В этом случае это ничего не значит, но на самом деле возможно, что отладчики имеют ошибки.
Я помню, что я искал несколько часов, чтобы исправить ошибку в моем коде, который я обнаружил при отладке. Но ошибок не было. По крайней мере, не в моем коде. Отладчик сообщил мне некоторые значения в памяти, но был не прав.
Если это странное поведение происходит всегда, попробуйте поставить за ним инструкцию отладки:
System.out.println(left + " && " + right + " == " + complete);
Я уверен, что результат будет правильным. Попробуйте запустить отладчик с добавлением этой строки. Если такая оптимизация происходит, как я описал, она должна исчезнуть, потому что она больше не может повторно использовать left
.
Ответ 2
Я воспроизвел ваш код, и вот что я нашел:
![]()