【问题标题】:Java .contains() not behaving as I expectedJava .contains() 的行为不像我预期的那样
【发布时间】:2018-12-15 02:50:16
【问题描述】:

我有一个问题,.contains() 在查找子字符串时没有返回 true

请参阅下面的代码 sn-p 和显示以下代码的变量值的图像。我遇到的问题是表达式返回false,而我认为它显然应该是true

if (this.fileName.toLowerCase().contains(extension.toLowerCase())){
  return true;
}

我今天遇到了这个问题,在网上搜索后,我看不到这里发生了什么明显的事情。

我已经尝试过使用文字,但仍然无法评估为真:

if ("Android App Image.jpg".toLowerCase().contains("jpg".toLowerCase())){
  return true;
}

我已将其进一步分解,因此结果为布尔值:

boolean result = ("Android App Image.jpg".contains("jpg"));

if (result) {
  return true;
}

结果为真,所以.contains 不是问题,而是我的if() 没有将布尔值评估为真,也不会导致return true 执行。

我现在认为这是我的 while 循环(下面的完整功能)的问题。枚举是否异步运行?

public boolean isImage(){
    String[] imageExtensions = {"jpg", "png", "bmp", "gif"};

    for (String extension: imageExtensions) {

        if (this.localFileURLString != null && this.localFileURLString.toLowerCase().contains(extension)){
            return true;
        }

        boolean result = ("Android App Image.jpg".toLowerCase().contains("jpg".toLowerCase()));

        if (result) {
            return true;
        }else{
            Log.i("TEACH", "If evaluated false");
        }
    }

    return false;
}

更新 1/2:

我已经精简了整个函数,使用硬编码文字并且不再使用快速枚举,当我期望它返回 true 时,它仍然返回 false

public boolean isImage(){
    String[] imageExtensions = {"jpg", "png", "bmp", "gif"};

    for (int x = 0; x < imageExtensions.length; x++) {

        // String extension = imageExtensions[x];

        boolean result = ("Android App Image.jpg".toLowerCase().contains("jpg".toLowerCase()));

        if (result) {
            return true;
        }else{
            Log.i("TEACH", "If evaluated false");
        }
    }

    return false;
}

该函数不返回true"If evaluated false"日志被执行,它只是在评估if (result) {行后直接跳转到函数的最后一行(return false;)......就像if 打破循环。

更新 2/2:

很简单,即使是我的函数中最简单的if 语句也会导致代码跳转到函数的最后一行并返回false。例如:

if(true == true){
  return true
}

在调试模式下单步执行时会发生这种情况,并且编码日志在未附加到窃听器时也会显示相同的结果。

从函数返回后every 照常进行。没有错误或警告。

重新安装 Android Studio,尝试不同的模拟器和物理 Android 设备并没有解决问题。

重命名函数并不能解决问题。

将函数的返回类型从 boolean 更改为 Boolean 确实解决了问题。

我很清楚这些类型的差异,但我仍然对为什么会出现这个问题感到困惑。我只能假设以这种方式解决的更改方法签名是在编译时发生的一些时髦的事情。

我将暂时保留这个问题,因为即使更改返回类型为我“修复”了问题,我仍然不满意我会知道为什么......可能永远不会。

希望对这些问题有更多了解的人可以启发一切!

【问题讨论】:

  • 您的代码本身没有问题。
  • 您的示例工作正常。这个问题一定是我在别的地方。请提供更广泛的示例
  • 旁注,将扩展名与.endsWith()进行比较
  • 你有什么版本的JDK?如果我没记错的话,前段时间 .contains() 不适用于字符串。想想 pre-1.4 什么的。
  • 你也可以在.class文件中查看编译后的代码。

标签: java android string contains


【解决方案1】:

您的搜索词产生误报。因为文件名字符串可以有一个与扩展名匹配的子字符串。 为避免这种情况,您可以在搜索词前加上一个点。

String[] imageExtensions = {".jpg", ".png", ".bmp", ".gif"};

这将明显解决您的问题。 如果文件名中不规则地使用 DOT,它可能会产生误报。 希望能帮助到你。

【讨论】:

  • 我已经更新了问题(编辑#2),看起来问题与编译器有关,但目前不确定。感谢您的意见!
【解决方案2】:

你为什么不尝试使用:

if (this.fileName.toLowerCase().contains(extension.toLowerCase()==true){
}

【讨论】:

  • 我已经更新了问题(编辑#2),看起来问题与编译器有关,但目前不确定。感谢您的意见!
  • 我已经更新了问题(编辑#2),看起来问题与编译器有关,但目前不确定。感谢您的意见!
猜你喜欢
  • 2021-12-10
  • 1970-01-01
  • 2020-03-11
  • 2016-01-28
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
相关资源
最近更新 更多