首页 > 解决方案 > Java .contains() 的行为不像我预期的那样

问题描述

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

请参阅下面的代码片段和图像,其中显示了以下代码的变量值。我遇到的问题是表达式返回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:

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

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"直接跳转到函数的最后一行( ) ……就好像中断循环一样。return false;if (result) {if

更新 2/2:

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

if(true == true){
  return true
}

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

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

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

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

将函数的返回类型从更改booleanBoolean确实解决了该问题。

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

我现在将问题悬而未决,因为即使更改返回类型为我“解决了”问题,我仍然不满意我会知道为什么......可能永远不会。

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

标签: javaandroidstringcontains

解决方案


你为什么不尝试使用:

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

推荐阅读