Java .contains()的行为不符合我的预期

时间:2018-07-06 13:19:55

标签: java android string contains

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

请参见以下代码段和图像,其中显示了以下代码的变量值。我的问题是表达式返回false,而我认为它显然应该是true

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

Screen grab of debug showing variable values at runtime

我今天遇到了这个问题,在网上搜索后,看不到任何明显的迹象。

我使用文字尝试了相同的操作,但仍然无法得出正确的结果:

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

我将其细分为布尔值:

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

if (result) {
  return true;
}

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

我现在认为这是我的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"日志,它只是在评估行{{1之后,直接跳到函数的最后一行(return false;) }} ...好像if (result) {中断了循环。

更新2/2:

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

false

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

从函数返回后,每个都正常进行。没有错误或警告。

重新安装Android Studio,尝试使用其他模拟器和物理Android设备无法解决该问题。

重命名功能无法解决问题。

将函数的返回类型从if(true == true){ return true } 更改为boolean确实解决了该问题。

我很清楚这些类型的区别,但是对于为什么会出现此问题,我仍然感到困惑。我只能假设以这种方式解决方法签名更改问题在编译时就发生了。

我现在暂时不提问题,即使更改返回类型为我“解决了”问题,我仍然不满意,我会知道为什么...也许永远不会。

希望在这些问题上有很多知识的人能启发一切!

2 个答案:

答案 0 :(得分:1)

为什么不尝试使用:

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

答案 1 :(得分:0)

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

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

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