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

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

在此处输入图像描述

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

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

这是Windows上的Netbeans 7.3.1。

Edit01

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

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

Edit02

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

我看到了几种可能性,但我不相信它在JVM中是内部错误的。 调试器可能只是被欺骗或窃听。

  1. 在引擎盖下进行一些优化,导致leftcomplete在堆栈上是相同的变量。 所以这大致意味着你的代码已经优化了:

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

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

  2. NetBeans调试器真的很烦人。 从我的C ++调试经验来看,实际上调试器中存在一个错误(听起来很有趣,正确)会导致调试器无法正确读取内存中的整数值。 有时结果是关闭的。 在这种情况下,这并不意味着什么,但实际上调试器确实可能存在错误。

    我记得我一直在寻找几个小时来修复我通过调试发现的代码中的错误。 但没有错误。 至少不在我的代码中。 调试器在内存中报告了一些值,但是错了。

如果这种奇怪的行为总是发生,那么试着在它后面放一个调试语句:

 System.out.println(left + " && " + right + " == " + complete); 

我打赌输出是正确的。 尝试运行调试器也添加此行。 如果像我描述的那样进行这样的优化,它应该消失,因为它不能再重复使用了。

我复制了你的代码,这是我发现的: