首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >声称((true & false) == true)

声称((true & false) == true)
EN

Stack Overflow用户
提问于 2013-12-23 14:56:42
回答 2查看 1.1K关注 0票数 13

我只是遇到了一些无法理解逻辑的东西。下面的情况怎么会发生?

我已经尝试了所有常用的方法来解决这个问题:清理/构建、重新启动netbeans等等,但是问题仍然存在。变量complete总是正确的,不管我做什么。我甚至将leftright分别替换为truefalse布尔值,但没有改变。真正起作用的是变量的重构重命名,但是当我将它更改回原来的时候,问题再次出现了。没有以相同方式命名的类成员。

到底怎么回事?我是不是终于失去理智了,还是这个变量应该有一个false值?

这是Windows上的Netbeans 7.3.1版本。

Edit01

我将努力向不信的人证明,当我在一周左右的时间内访问到我的工作电脑时,这是真的发生了。同时,相信我的话。这不是恶作剧,也不是因为我缺乏使用Netbeans调试的知识而发生的。

我确实记得在这种情况发生之前执行了一堆svn切换到复制命令,但对于此代码所在的项目(依赖项)则不这样做。任何情况下,干净/构建都应该处理好任何不一致之处。我也不记得清除Netbeans缓存,我现在对此感到遗憾。

Edit02

恨我的人会讨厌,但正如我担心的那样,回到我的工作站后,我再也不能复制这个问题了。承认这一点让我很生气,但我没有任何证据证明这件事曾经发生过。我所做的就是:从冬眠中唤醒我的pc,取消我变量的重构重命名,这是我在完成工作之前所做的最后一件事,一次干净/构建,然后是另一次调试运行。一切都是just..works。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-24 02:50:59

我看到了几种可能性,但我不认为JVM内部是错误的。调试器可能只是被欺骗或窃听。

  1. 一些优化正在进行,导致leftcomplete在堆栈上是相同的变量。因此,这大致意味着您的代码被优化为: 布尔左=(开始<=偏移);布尔右=(停止+1 >=偏移);左=左&右;//重用“左”而不是新变量“完全” 然而,据我所知,Java编译器不会进行这种优化。如果这不是真的,有人能确认或提供细节吗?(可能是javac还是JIT做的?)
  2. NetBeans调试器真的很麻烦。根据我的C++调试经验,调试器中实际上存在一个错误(听起来很有趣,是这样),它导致调试器无法正确地从内存中读取整数值。有时结果不太理想。在这种情况下,这并不意味着什么,但实际上可能调试器确实有bug。 我记得我已经搜索了几个小时来修复我通过调试发现的代码中的一个bug。但没有窃听器。至少在我的代码里没有。调试器向我报告了内存中的一些值,但都是错误的。

如果这种奇怪的行为总是发生,那么尝试将调试语句放在后面:

代码语言:javascript
运行
复制
System.out.println(left + " && " +  right + " == " + complete);

我打赌输出是正确的。尝试运行调试器也增加了这一行。如果像我所描述的那样发生这样的优化,那么它就应该消失,因为它不能再重用left了。

票数 3
EN

Stack Overflow用户

发布于 2013-12-23 19:15:24

我复制了您的代码,下面是我发现的:

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20745964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档