繁体   English   中英

Java .contains()行为异常

[英]Java .contains() not behaving as I expected

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

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

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

调试屏幕截图,显示了运行时的变量值

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

我已经尝试过使用文字进行相同的操作,但是仍然无法评估为true:

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

我现在认为这是我的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"日志,则在评估该行if (result) { ...之后,直接跳到该函数的最后一行( return false; ),就好像if打破循环。

更新2/2:

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

if(true == true){
  return true
}

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

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

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

重命名该功能不能解决问题。

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

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

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

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

为什么不尝试使用:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM