2013-12-23 40 views
13

我刚遇到一些无法理解我的逻辑的东西。以下情况如何发生?Netbeans Java调试器声称((true && false)== true)

enter image description here

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

发生了什么事?我终于失去了主意,或者该变量的值是否为false

这是在Windows上的Netbeans 7.3.1。

Edit01

我会尽力证明给不信的人,这其实是发生的事情,当我进入我的工作电脑在一个星期左右。同时,请听取我的意见。这不是恶果,也不是由于我缺乏Netbeans调试知识而发生的。

我确实记得在发生这种情况之前做了一堆svn switch-to-copy命令,但不是代码驻留在(依赖项)中的项目。无论如何,清理/构建应该注意到任何不一致。我也不记得清除Netbeans缓存,我现在很遗憾。

Edit02

仇敌会讨厌,但我担心的一样,回到我的工作站后,我再也不能重现此问题。它让我不得不承认这一点,但我没有证据证明这件事发生过。我所做的只是:将我的电脑从休眠状态唤醒,取消了对变量的重构重命名,这是我在完成工作之前完成的最后一件事情,清洁/构建,然后是另一次调试运行。一切只是..工作。

+0

美丽,简单美丽。 java不知道如何做布尔操作... –

+0

不,HighCore是正确的。该计划相应地行为不端,@ikegami。 – predi

+0

出于好奇,代码是否输入以下'if'块? 'complete'是'true','context.isEmpty()'是'false'。 –

回答

3

我看到一对夫妇的可能性,但我不相信它是在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

+0

最初的陈述是'boolean complete = start <= offset && stop + 1> = offset',这是一个错误的行为。我分解了这个表达式,因为我不明白它是如何返回true的。所以我不认为1中的情况适用于我的问题。请注意,即使在我将其更改为“boolean complete = true && false”和clean/build后,它仍然返回true。 – predi

+0

我之所以开始调试此代码,是因为我的程序以意想不到的方式行事异常。我几乎可以肯定你的'系统。out“的行为与调试器的行为相同,因为程序的流程(按照屏幕截图中的内容)相应地发生了变化。但我无法确定。 – predi

+1

你不能把你的代码打印语句看到结果吗? –

-2

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

+15

输出故意或部分阴谋中的“强迫性”拼写错误? ;-) – haraldK