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

2022-09-04 23:31:53

我只是遇到了一些违背我对逻辑理解的东西。以下情况怎么可能发生?

enter image description here

我已经尝试了所有常用的方法来解决这个问题;清理/构建、重新启动 netbean 等,但问题仍然存在。变量总是正确的,无论我做什么。我甚至分别替换了 和 和 布尔值,但没有变化。有效的是重构变量的重命名,但是当我将其更改回原始版本时,问题再次浮出水面。没有以相同方式命名的类成员。completeleftrighttruefalse

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

这是在Windows上的Netbeans 7.3.1中。

编辑01

我将尝试向不信的人证明这确实正在发生,当我在一周左右的时间内访问我的工作计算机时。在平均时间里,请相信我的话。这不是恶作剧,也不是因为我缺乏使用 Netbeans 进行调试的知识而发生的。

我记得在发生这种情况之前,我做了一堆svn切换到复制的命令,但不是针对此代码所在的项目(依赖项)。无论如何,清理/构建都应该处理任何不一致。我也不记得清除 Netbeans 缓存,我现在很后悔。

编辑02

讨厌的人会讨厌,但正如我所担心的那样,回到我的工作站后,我不能再重现这个问题。承认这一点让我很生气,但我没有任何证据证明这种情况曾经发生过。我所做的只是:从休眠状态唤醒我的电脑,撤消对变量的重构重命名,这是我在完成工作之前做的最后一件事,清理/构建,然后再次运行调试。一切都只是..工程。


答案 1

我看到了几种可能性,但我不认为这在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);

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


答案 2

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