Java.contains()的行为不符合我的预期
查找子字符串时,Java.contains()的行为不符合我的预期,java,android,string,contains,Java,Android,String,Contains,查找子字符串时,.contains()没有返回true的问题 请参阅下面的代码片段和图像,其中显示了以下代码的变量值。我遇到的问题是,表达式返回false,而我认为它显然应该是true if (this.fileName.toLowerCase().contains(extension.toLowerCase())){ return true; } 今天我遇到了这种情况,在搜索了网络之后,我看不到任何明显的变化 我使用文字尝试了相同的方法,但仍然没有计算为true: if ("Andro
.contains()
没有返回true
的问题
请参阅下面的代码片段和图像,其中显示了以下代码的变量值。我遇到的问题是,表达式返回false
,而我认为它显然应该是true
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,也不会导致执行返回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;
}
这是在调试模式下单步执行时发生的,编码日志在未连接到bugger时也显示相同的结果
从功能返回后,每一次都正常进行。没有错误或警告
重新安装Android Studio,尝试不同的模拟器和物理Android设备并没有解决这个问题
重命名函数无法解决此问题
将函数的返回类型从boolean
更改为boolean
确实解决了问题
我很清楚这些类型的差异,但我仍然不明白为什么会出现这个问题。我只能假设以这种方式更改方法签名是在编译时发生的事情
我将暂时不回答这个问题,因为即使更改退货类型“修复”了我的问题,我仍然不满意我将知道为什么。。。也许永远不会
希望在这类问题上有更多知识的人能够启发大家 为什么不尝试使用:
if (this.fileName.toLowerCase().contains(extension.toLowerCase()==true){
}
你的搜索词会产生误报。原因文件名字符串可以具有与扩展名匹配的子字符串。 为了避免这种情况,可以在搜索词前面加一个点
String[]imageExtensions={.jpg“,.png“,.bmp“,.gif”}代码>
这显然会解决你的问题。
如果文件名中有任何不规则的点使用,则可能产生误报。
希望能有帮助 您的代码本身没有问题。您的示例运行正常。这件事一定是在别的地方发生的。请提供一个更广泛的示例。请注意,将扩展与.endsWith()进行比较。
您有什么版本的JDK?如果我没记错的话,不久前.contains()不适用于字符串。想想1.4之前的版本吧。你也可以检查.class文件中的编译代码。我已经更新了问题(编辑#2),看起来问题与编译器有关,但目前还不确定。谢谢你的意见!我已经更新了问题(编辑#2),看起来问题与编译器有关,但目前还不确定。谢谢你的意见!我已经更新了问题(编辑#2),看起来问题与编译器有关,但目前还不确定。谢谢你的意见!
if (this.fileName.toLowerCase().contains(extension.toLowerCase()==true){
}