【问题标题】:Java / Android Studio / If statement not being executed despite it matching the conditionJava / Android Studio / If 语句没有被执行,尽管它符合条件
【发布时间】:2020-02-16 17:04:39
【问题描述】:

我已经编码了几十年,并且使用过许多不同的语言。目前我正在为 Uni 课程做一个简单的 Java 应用程序。课程很简单,但我遇到了一个 if 语句的问题,即使它匹配条件也不希望执行。

我承认我有点不好意思问这么简单的问题,但这是一个我花了更多时间努力解决的问题。

请允许我详细说明:

我有两个变量,一个是本地私有的,一个是生成的,都定义为int_selectedImageclickedImageID,两者都提供给一个检查它们是否相同的 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

您将看到 45 的相关值,它们都是 int,用于 clickedImageID_selectedImage,而 firstRunfalse

发现尽管满足条件,调试器如何认为在第 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


【解决方案1】:

您能否分享有关该问题的更多详细信息,或者将整个代码粘贴到问题部分。


我使用了几乎相同的代码,它对我来说很好。

class Test{
    private static int _selectedImage;

    public static void setPuzzlePiece(int clickedImageID) {
        Boolean firstRun = (clickedImageID == _selectedImage);
        if (firstRun == false) {
            String debugPoint = "adding this here just to attach a debug point";
            System.out.println(debugPoint);
        }
    }

    public static void main(String[] args) throws java.lang.Exception {
        _selectedImage = 10;
        setPuzzlePiece(11);
    }
}

输出 - 在此处添加只是为了附加调试点

尝试重新启动 IDE 或使缓存无效。

【讨论】:

  • ideone.com/sfvgnn你可以在这里编译运行代码。
  • 老实说,我需要分享整个项目,老实说,我有点不愿意这样做,因为它已经完成了一半。请注意,没有编译器错误,调试器显示正确的流程和变量。我尝试使用 ideone,但它抛出了很多编译器错误,当我编译应用程序并通过 android 模拟器运行它时,这些错误都不存在。该应用程序在 Android Studio 中完全按照预期运行和操作,除非有这个条件 if 块,所以我猜 ideone 不是为 Android 设计的。
  • 能否尝试重新启动 IDE 或使缓存失效。
  • 我已经多次重新启动 IDE(和模拟器),清除缓存是指在 AVD 图像缓存上还是在其他地方缓存。对于我对 Android Studio 缺乏经验,我深表歉意,我只使用了几个星期,仍然觉得它“烦人”。
  • 没有问题,在大多数 IDE 中,您可以选择使 IDE 的缓存无效。我不确定您使用的工具是否具有该功能。它存在于 IntelliJ Idea 、 Eclipse ...
【解决方案2】:

它适用于我的机器...当我运行此代码时,它会到达打印语句。

 public static void main(String[] args) {
    setPuzzlePiece(3);

}

private static int _selectedImage = 1;

public static void setPuzzlePiece(int clickedImageID) {
    // selectedImage == clickedImageID on first run.
    Boolean firstRun = (clickedImageID == _selectedImage);
    if (firstRun == false) {
        // do stuff
        System.out.println("adding this here just to attach a debug point");
    }
}

【讨论】:

  • 谢谢你,是的,这就是问题所在,它应该可以工作,我提供的代码应该可以工作,调试数据显示它应该可以工作,但它没有。很明显,这是正在做的事情,但我一生都看不到它。
  • 那么这段代码是否按预期工作?然后看起来你的图片不正确。也许重新启动或使现金无效。
  • 你的代码和我的一样,除了 system.out 到而不是字符串赋值。本质上,如果该块拒绝执行,则 if 块内部发生的事情是无关紧要的。虽然我很欣赏所做的努力。
  • @user3311217 这就是重点。由于代码相同,因此应该有其他与代码无关的错误。如果您检查您的代码和实际使用变量而不是仅仅声明它的代码之间没有区别(可以优化什么),您肯定会知道
  • 正如我所说,我已经编写了几十年的代码,我已经经历了所有会导致问题的常见事情,范围界定、拼写、作业、演员表等等......有些东西错了,我们可以达成一致。我认为 firstRun 不是 Java 中的保留字 - 即使它是本地范围是条件中使用的。另外,如果我使用保留字,我希望 IDE 或编译器会对其进行标记。
【解决方案3】:

尝试使用 firstRun.toString() 打印 firstRun 的值;在 if 语句之外。 以及 clickedImageID 和 _selectedImage 使用 toString() 方法的值。

【讨论】:

  • 因为 fristRun 是一个布尔值,所以没有可用的 toString() 方法,这两个 int 的方法相同,
【解决方案4】:

所以说实话,我真的不明白发生了什么,我已经将我的函数(保持相同的名称和参数)重写为这个..

    public void setPuzzlePiece(int clickedImageID) {
            boolean areEqual = (clickedImageID == _selectedImage);
            if (!areEqual) {
                System.out.print("they are equal");
            }
    }

..然而你瞧,它现在在!areEqual 时执行 if 块。如果有人愿意指出为什么上面的代码有效而我在 OP 中发布的代码无效,那么我将非常感激,因为我希望不再遇到这个问题。

我应该指出我除了在 IDE 中什么都没做,删除函数内容(保留定义)并将 firstRun 替换为 areEqual。

firstRun 是否以某种方式原生于 Android 系统?你希望编译器会提出这个问题,但这似乎(对我来说)是这里的问题。

【讨论】:

    猜你喜欢
    • 2015-11-26
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2019-01-24
    相关资源
    最近更新 更多