【问题标题】:Netbeans Java Debugger claims that ((true && false) == true)Netbeans Java Debugger 声称 ((true && false) == true)
【发布时间】:2013-12-23 14:56:42
【问题描述】:

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

我已经尝试了所有常用的方法来解决这个问题;清理/构建,重新启动 netbeans 等,但问题仍然存在。无论我做什么,变量complete 总是正确的。我什至分别用truefalse 布尔值替换了leftright,但没有变化。起作用的是对变量进行重构重命名,但是当我将其改回原来的值时,问题又出现了。没有以相同方式命名的班级成员。

发生了什么事?我终于失去理智了,还是该变量的值应该是false

这适用于 Windows 上的 Netbeans 7.3.1。

编辑01

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

我确实记得在此之前执行了一堆 svn switch-to-copy 命令,但不是针对此代码所在的项目(依赖项)。无论如何,一个干净/构建应该已经处理了任何不一致。我也不记得清除 Netbeans 缓存,我现在对此感到遗憾。

编辑02

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

【问题讨论】:

  • 美丽,简直美丽。 java不知道如何进行布尔运算...
  • 不,HighCore 是正确的。该程序相应地行为不端,@ikegami。
  • 出于好奇,代码是否进入了下面的if 块? completetruecontext.isEmpty()false
  • 这要么是一个糟糕的 Photoshop 笑话,要么你在调试时修改了代码......
  • 仅仅因为您在调试器中在第 527 行停止时修改了左/右并不意味着再次执行第 525 行。将断点放在第 525 行,让我们看看值的含义。

标签: java debugging netbeans


【解决方案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

【讨论】:

  • 最初的声明是boolean complete = start &lt;= offset &amp;&amp; stop + 1 &gt;= offset,这是一个行为不端。我拆分了表达式,因为我不明白它如何返回 true。所以我认为 1. 中的情况不适用于我的问题。请注意,即使我将其更改为 boolean complete = true &amp;&amp; false 和一个 clean/build,它仍然返回 true。
  • 我首先开始调试这段代码的原因是我的程序以一种意想不到的方式出现了异常。我几乎可以肯定您的 System.out 会以与调试器相同的方式运行,因为程序的流程(按照屏幕截图中的内容)已相应更改。不过我不能肯定。
  • 你不能把那个打印语句放在你的代码中看看结果吗?
  • 是的。发生在我工作的最后一个小时……某种圣诞前的奇迹。
  • 由于我无法重现我的问题(请参阅我的上一次编辑),我可能永远无法深入了解到底发生了什么。这是最有帮助的答案,所以我选择它作为回答我问题的答案。谢谢。
【解决方案2】:

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

【讨论】:

  • 输出中的“compelte”拼写错误是故意的,还是阴谋的一部分? ;-)
猜你喜欢
  • 2020-12-10
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 2017-07-29
  • 2017-05-02
  • 2012-02-27
  • 2015-10-03
  • 1970-01-01
相关资源
最近更新 更多