我偶尔会收到String.equals(String)的奇怪结果。
这是代码:
boolean equals(OutputHolder other){
boolean result=true;
if( ! this.speciesEng.equals(other.speciesEng))
result=false;
else if( ! this.date.equals(other.date))
result=false;
else if( ! this.gridRef.equals(other.gridRef))
result=false;
else if( ! this.recorder.equals(other.recorder))
result=false;
return result;
}
所有这些都非常直接,但在某些对象上.equals()在看似2个相同的字符串时返回false。
这是错误发生时Expressions监视列表的屏幕截图。你可以看到this.speciesEng.equals(other.speciesEng)返回false,尽管两个字符串看起来都是一样的。
字符串最初来自相同的字符串资源,但两者都通过XMPP连接并返回。
编辑:要通过XMPP连接传递它们,它们已与其他字符串连接以表示整个OutputHolder。然后使用.substring(start,end)返回它们。在我看来,如果我从子字符串中创建一个新字符串但它没有任何效果,它可能会有所不同。也没有修剪它们。
我对如何继续调试问题感到茫然。欢迎任何帮助或建议。
答案 0 :(得分:2)
确保没有尾随空格。因此,在使用trim
方法进行比较之前,最好在字符串上使用equals
方法。
答案 1 :(得分:2)
那里可能有一些空白。在调用equals之前使用String#trim
方法。
答案 2 :(得分:1)
我认为你应首先trim
两个字符串并删除额外的空格
这样,您就可以正确地等同Strings
。
示例代码:
String yourString = "Your String ";
//Trim the String and get rid of extra spaces before doing any comparisons.
yourString.trim();
//After trimming it, do the comparisons.
if(yourString.equalsIgnoreCase("other trimmed string"))
{
.....
}
我希望这会有所帮助。
答案 3 :(得分:0)
boolean equals(OutputHolder other){
boolean t1 = speciesEng.equals(other.speciesEng);
boolean t2 = date.equals(other.date);
boolean t3 = gridRef.equals(other.gridRef);
boolean t4 = recorder.equals(other.recorder);
return t1 && t2 && t3 && t4;
}
答案 4 :(得分:0)
在上帝知道从调试器复制和粘贴多少小时到十六进制编辑器后,我发现了问题和一个有效的解决方案。
正如所建议的那样,问题是空白,但不是我或(我认为)其他人怀疑的方式。 由于某种原因,我未能深究,我在我的字符串中得到了不间断的空格(0x00A0)而不是普通的空格(Ox0020)。这似乎或多或少随机发生,我还没有找到负责的代码部分。
目前的工作是用以下方法启动我的equals()方法:
speciesEng=speciesEng.replace((char)0x00a0,(char)0x0020);
other.speciesEng=other.speciesEng.replace((char)0x00a0,(char)0x0020);
speciesEng=speciesEng.trim();
other.speciesEng=other.speciesEng.trim();
远非优雅,但它暂时起作用。如果有人有更多要补充的话,我会将问题保持开放几天。
感谢大家的回答。