Подтвердить что ты не робот

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

Хаттеры будут ненавидеть, но, как я боялся, после возвращения на свою рабочую станцию, я больше не могу воспроизвести эту проблему. Меня это раздражает, признавая это, но у меня нет никаких доказательств того, что это когда-либо случалось. Все, что я сделал, это: разбудить мой компьютер из спящего режима, отключить рефакторинг переименовать мою переменную, что было последним, что я сделал до завершения моей работы, чистым/сборочным, а затем другим прогоном отладки. Все просто.. работает.

4b9b3361

Ответ 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

Я воспроизвел ваш код, и вот что я нашел: