Netbeans Java Debugger声称((true && false)== true)

pre*_*edi 13 java debugging netbeans

我刚遇到的东西违背了我对逻辑的理解.下面的情况如何发生?

在此输入图像描述

我已经尝试了所有常用的方法来解决这个问题; 清理/构建,重新启动netbeans等,但问题仍然存在.complete无论我做什么,变量总是如此.我甚left至分别替换了和rightwith truefalseboolean值,但没有变化.什么工作,是变量的重构重命名,但当我把它改回原来,问题重新浮出水面.没有以相同方式命名的类成员.

这是怎么回事?我是否最终失去了理智,或者该变量是否具有值false

这是Windows上的Netbeans 7.3.1.

Edit01

当我在一周左右的时间内访问我的工作计算机时,我会尝试向不信的人证明这是实际发生的事情.同时,请接受我的话.这不是一个恶作剧,也不是因为我缺乏Netbeans调试知识而发生的.

我确实记得在发生这种情况之前做了一堆svn switch-to-copy命令,但不是这个代码所在的项目(依赖项).无论如何,清洁/构建应该注意任何不一致.我也不记得清除Netbeans缓存,我现在后悔了.

Edit02

仇恨者会讨厌,但正如我担心的那样,在回到我的工作站后,我再也无法重现这个问题了.我很生气地承认这一点,但我没有证据证明这件事曾经发生过.我所做的就是:从休眠状态唤醒我的电脑,解除我的变量的重构重命名,这是我在完成工作之前做的最后一件事,一个干净/构建,然后是另一个调试运行.一切都只是......工作.

Mar*_*aux 3

我看到了几种可能性,但我不认为 JVM 内部有错误。调试器可能只是被欺骗或被窃听。

  1. 一些优化正在幕后进行,导致leftcomplete成为堆栈上的相同变量。所以这大致意味着您的代码已优化为:

    boolean left = (start <= offset);
    boolean right = (stop + 1 >= offset);
    left = left && right;   // reused "left" instead of new variable "complete"
    
    Run Code Online (Sandbox Code Playgroud)

    然而,据我所知,Java 编译器不会进行这种优化。如果这不是真的,有人可以确认或提供详细信息吗?(也许 javac 或 JIT 可以做到这一点?)

  2. NetBeans 调试器确实很容易出错。根据我的 C++ 调试经验,调试器中实际上存在一个错误(听起来很有趣,对吧),导致调试器无法正确从内存中读取整数值。有时结果并不理想。在这种情况下这并不意味着任何事情,但实际上调试器确实可能存在错误。

    我记得我花了几个小时来修复通过调试发现的代码中的错误。但没有出现任何错误。至少在我的代码中没有。调试器向我报告了内存中的一些值,但它们是错误的。

如果这种奇怪的行为总是发生,那么尝试在其后面添加调试语句:

System.out.println(left + " && " +  right + " == " + complete);
Run Code Online (Sandbox Code Playgroud)

我敢打赌输出会是正确的。尝试在添加此行的情况下运行调试器。如果像我描述的那样发生这样的优化,它应该消失,因为它不能left再重用。