我刚刚遇到了一些违反我的逻辑理解的事情。怎么会出现下面的情况呢?
我已经尝试了所有常用的方法来解决这个问题;清理/构建、重启 netbeans 等,但问题仍然存在。无论我做什么,变量 complete
始终为真。我什至将 left
和 right
分别替换为 true
和 false
boolean 值,但没有变化。起作用的是变量的重构重命名,但是当我将其改回原始值时,问题又出现了。没有以相同方式命名的类(class)成员。
这是怎么回事?我终于失去理智了,还是该变量的值应该为 false
?
这是 Windows 上的 Netbeans 7.3.1。
Edit01
当我在一周左右的时间内访问我的工作计算机时,我将尝试向不相信的人证明这确实发生了。与此同时,请相信我的话。这不是恶作剧,也不是因为我缺乏使用 Netbeans 进行调试的知识。
我确实记得在发生这种情况之前执行了一系列 svn switch-to-copy 命令,但不是针对此代码所在的项目(依赖项)。清理/构建应该已经解决了任何不一致的问题。我也不记得清除 Netbeans 缓存,我现在后悔了。
Edit02
讨厌的人会讨厌,但正如我所担心的,回到我的工作站后,我无法再重现这个问题。承认这一点让我很生气,但我没有任何证据证明这曾经发生过。我所做的只是:将我的电脑从 hibernate 状态唤醒,撤销对我的变量的重构重命名,这是我在完成工作之前所做的最后一件事,清理/构建然后另一个调试运行。一切都只是..有效。
最佳答案
我看到了几种可能性,但我不认为这是 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 调试器确实存在问题。根据我的 C++ 调试经验,调试器中确实存在一个错误(听起来很有趣,对吧)导致调试器无法从内存中正确读取整数值。有时结果不对。这在这种情况下没有任何意义,但实际上调试器确实有可能存在错误。
我记得我花了好几个小时来修复我在调试时发现的代码中的错误。但是没有错误。至少不在我的代码中。调试器向我报告了内存中的一些值,但这些值是错误的。
如果这种奇怪的行为总是发生,那么试着在它后面放一条调试语句:
System.out.println(left + " && " + right + " == " + complete);
我打赌输出是正确的。尝试在添加此行的情况下也运行调试器。如果像我描述的那样发生这样的优化,它应该消失,因为它不能再重用 left
。
关于java - Netbeans Java 调试器声称 ((true && false) == true),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20745964/