【发布时间】:2020-02-16 17:04:39
【问题描述】:
我已经编码了几十年,并且使用过许多不同的语言。目前我正在为 Uni 课程做一个简单的 Java 应用程序。课程很简单,但我遇到了一个 if 语句的问题,即使它匹配条件也不希望执行。
我承认我有点不好意思问这么简单的问题,但这是一个我花了更多时间努力解决的问题。
请允许我详细说明:
我有两个变量,一个是本地私有的,一个是生成的,都定义为int。 _selectedImage 和 clickedImageID,两者都提供给一个检查它们是否相同的 public void 函数。应用程序第一次运行时它们将是相同的,而每隔一次运行该函数时则不同。
但是,无论我做什么,它都不想执行 if 块。让我演示一下:
private int _selectedImage;
public void setPuzzlePiece(int clickedImageID) {
// selectedImage == clickedImageID on first run.
Boolean firstRun = (clickedImageID == _selectedImage);
if (firstRun==false) {
// do stuff
String debugPoint = "adding this here just to attach a debug point";
}
}
我提供了一个调试过程的屏幕截图,突出显示了这些值:
https://i.imgur.com/ahgNZLP.png
您将看到 4 和 5 的相关值,它们都是 int,用于 clickedImageID 和 _selectedImage,而 firstRun 为 false。
发现尽管满足条件,调试器如何认为在第 77 行没有找到可执行代码,并且单步调试它只是“忽略”了 if 条件。但是我们都可以看到逻辑,很清楚它应该执行该块。
我最初将此作为一个简单的比较。 if (_selectedImage==clickedImageID) { .. } 但已将条件转换为布尔值并对其进行比较。我还尝试了多种检测错误的方法,例如 (firstRun==false)、(!firstRun) 和 (firstRun==(!true)) 以及许多其他愚蠢的方法,但它非常简单,只需将布尔值与 true 或 false 进行比较就足够了.
如果我使用评估窗口,它会返回屏幕截图显示的内容,即满足 if 块条件但它仍然不会执行它。
这可能与 Java 及其比较有关。当我使用多种语言时,有时我会被每种语言的弱点所吸引。例如,在 c# 中,您可以通过 == 比较字符串,而在 Java 中,您使用 equals()。
这一定是我做错了什么,但我一辈子都看不到它。帮我发现我的愚蠢!
- ps:我检查了这是否是一个重复的问题,虽然一些线程与类似问题相关,但它们使用的是 PHP 或 C++,而不是 Java,而在 Java 中,这是一个简单的语法错误,导致它们失败。据我所知,这不是这里的问题。 *
提前致谢。
【问题讨论】:
-
尝试使用小写“布尔”作为 firstRun 的类型
-
由于第 77 行的代码没有做任何事情,它可能已经被优化掉了,这就是为什么“没有找到可执行代码”的原因。
debugPoint的下划线可能是这样的警告。尝试将其更改为打印或日志语句。 -
@HansKesting 我会的,这可能是问题所在,正如我所说的那样,每种语言的弱点都让我感到困惑,我认为它是布尔值!=布尔值(我的意思是,总的来说,它们显然是不同的对象)。
-
@Andreas 是的,我很感激,我的问题是它不应该。 if 块应根据该函数范围内的变量执行。
-
其实它们是同一个对象,但条件还是写成
if (! firstRun)比较好。 --- 注意!后面的空格,以帮助使操作员更明显。否则,在视觉快速扫描源代码时可能会错过它。
标签: java if-statement boolean