我刚遇到的东西违背了我对逻辑的理解。下面的情况如何发生?
我已经尝试了所有常用的方法来解决这个问题;清理/构建,重新启动netbeans等,但问题仍然存在。无论我做什么,变量complete
总是如此。我甚至分别将left
和right
替换为true
和false
布尔值,但没有更改。什么工作,是变量的重构重命名,但当我把它改回原来,问题重新浮出水面。没有以相同方式命名的班级成员。
发生了什么事?我最终失去了理智,或者该变量的值是否为false
?
这适用于Windows上的Netbeans 7.3.1。
Edit01
当我在一周左右的时间内访问我的工作电脑时,我会尝试向不信的人证明这是实际发生的事情。同时,请接受我的话。这不是一个恶作剧,也不是因为我缺乏Netbeans调试知识而发生的。
我确实记得在发生这种情况之前做了一堆svn switch-to-copy命令,但不是这个代码所在的项目(依赖项)。无论如何,清洁/构建应该注意任何不一致。我也不记得清除Netbeans缓存,我现在后悔了。
Edit02
仇恨会讨厌,但正如我所担心的那样,在回到我的工作站后,我再也无法重现这个问题了。我很生气地承认这一点,但我没有证据证明这件事曾经发生过。我所做的就是:从休眠状态唤醒我的电脑,解除我的变量的重构重命名,这是我在完成工作之前做的最后一件事,一个干净/构建,然后是另一个调试运行。一切都只是......工作。答案 0 :(得分:3)
我看到了几种可能性,但我不相信它在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
。
答案 1 :(得分:-2)
我复制了你的代码,这就是我发现的: