我只是遇到了一些无法理解逻辑的东西。下面的情况怎么会发生?
我已经尝试了所有常用的方法来解决这个问题:清理/构建、重新启动netbeans等等,但是问题仍然存在。变量complete
总是正确的,不管我做什么。我甚至将left
和right
分别替换为true
和false
布尔值,但没有改变。真正起作用的是变量的重构重命名,但是当我将它更改回原来的时候,问题再次出现了。没有以相同方式命名的类成员。
到底怎么回事?我是不是终于失去理智了,还是这个变量应该有一个false
值?
这是Windows上的Netbeans 7.3.1版本。
Edit01
我将努力向不信的人证明,当我在一周左右的时间内访问到我的工作电脑时,这是真的发生了。同时,相信我的话。这不是恶作剧,也不是因为我缺乏使用Netbeans调试的知识而发生的。
我确实记得在这种情况发生之前执行了一堆svn切换到复制命令,但对于此代码所在的项目(依赖项)则不这样做。任何情况下,干净/构建都应该处理好任何不一致之处。我也不记得清除Netbeans缓存,我现在对此感到遗憾。
Edit02
恨我的人会讨厌,但正如我担心的那样,回到我的工作站后,我再也不能复制这个问题了。承认这一点让我很生气,但我没有任何证据证明这件事曾经发生过。我所做的就是:从冬眠中唤醒我的pc,取消我变量的重构重命名,这是我在完成工作之前所做的最后一件事,一次干净/构建,然后是另一次调试运行。一切都是just..works。
发布于 2013-12-23 18:50:59
我看到了几种可能性,但我不认为JVM内部是错误的。调试器可能只是被欺骗或窃听。
left
和complete
在堆栈上是相同的变量。因此,这大致意味着您的代码被优化为:
布尔左=(开始<=偏移);布尔右=(停止+1 >=偏移);左=左&右;//重用“左”而不是新变量“完全”
然而,据我所知,Java编译器不会进行这种优化。如果这不是真的,有人能确认或提供细节吗?(可能是javac还是JIT做的?)如果这种奇怪的行为总是发生,那么尝试将调试语句放在后面:
System.out.println(left + " && " + right + " == " + complete);
我打赌输出是正确的。尝试运行调试器也增加了这一行。如果像我所描述的那样发生这样的优化,那么它就应该消失,因为它不能再重用left
了。
发布于 2013-12-23 11:15:24
我复制了您的代码,下面是我发现的:
https://stackoverflow.com/questions/20745964
复制相似问题