java - Netbeans Java 调试器声称 ((true && false) == true)

标签 java debugging netbeans

我刚刚遇到了一些违反我的逻辑理解的事情。怎么会出现下面的情况呢?

enter image description here

我已经尝试了所有常用的方法来解决这个问题;清理/构建、重启 netbeans 等,但问题仍然存在。无论我做什么,变量 complete 始终为真。我什至将 leftright 分别替换为 truefalse boolean 值,但没有变化。起作用的是变量的重构重命名,但是当我将其改回原始值时,问题又出现了。没有以相同方式命名的类(class)成员。

这是怎么回事?我终于失去理智了,还是该变量的值应该为 false

这是 Windows 上的 Netbeans 7.3.1。

Edit01

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

我确实记得在发生这种情况之前执行了一系列 svn switch-to-copy 命令,但不是针对此代码所在的项目(依赖项)。清理/构建应该已经解决了任何不一致的问题。我也不记得清除 Netbeans 缓存,我现在后悔了。

Edit02

讨厌的人会讨厌,但正如我所担心的,回到我的工作站后,我无法再重现这个问题。承认这一点让我很生气,但我没有任何证据证明这曾经发生过。我所做的只是:将我的电脑从 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);

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

关于java - Netbeans Java 调试器声称 ((true && false) == true),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20745964/

相关文章:

java使用线程来避免GUI死锁

Python:使用 gdb 调试(在 OSX 上)

java - "JSR-303 Provider is on the classpath"含义

java - 从 netbeans GUI 中的组合框获取值

java - NetBeans 与 IntelliJ IDEA 社区版

java - 编写关联两个屏幕的 SQL 查询

java - jpackage pkg codesign -- appstore 提交错误

java - Eclipse下调试Maven插件

java - 如何根据今天的日期从表中获取 10 天前的数据

debugging - 调试时如何读取/解码 Erlang 中列表理解的临时函数名称