Java o1.equals(对象o2)运算符导致错误
我正在尝试开发一个小的android应用程序,我遇到了一个相当“奇怪”的问题,我需要比较两个字符串,如果它们匹配,我需要做一些事情,我首先使用==运算符,即使这两个字符串相同,我的if语句也会将它们视为不相等,然后继续下一个语句(我知道这两个字符串是相等的,因为我观察它们的值并一步一步地调试)。因此我尝试使用.equals运算符,但在前面的两条语句中,它给了我StringIndexOutOfBoundsException,这两条语句是:Java o1.equals(对象o2)运算符导致错误,java,android,Java,Android,我正在尝试开发一个小的android应用程序,我遇到了一个相当“奇怪”的问题,我需要比较两个字符串,如果它们匹配,我需要做一些事情,我首先使用==运算符,即使这两个字符串相同,我的if语句也会将它们视为不相等,然后继续下一个语句(我知道这两个字符串是相等的,因为我观察它们的值并一步一步地调试)。因此我尝试使用.equals运算符,但在前面的两条语句中,它给了我StringIndexOutOfBoundsException,这两条语句是: String s1 = s.substring(0, s.
String s1 = s.substring(0, s.indexOf("\t"));
String s2 = subjectName.substring(0, subjectName.indexOf("\t"));
这是一个逐步调试的屏幕截图,s1和s2都有一个值“Mathematics”,但if语句忽略了它。
下面是一个更“完整”的代码:
if(marks.size()>0)
{
用于(学生:学生)
{
ArrayList subjectNames=新建ArrayList();
字符串studentFullName=student.getName()+“\t”+student.getName();
添加(studentFullName);
用于(主题:主题)
{
字符串subjectName=subject.getName()+“\t”+0;
subjectName.add(subjectName);
}
markListHashMap.put(studentFullName,subjectName);
}
用于(标记:标记)
{
Student=dbHelper.getStudent(mark.getStudentRegister());
字符串fullName=student.getName()+“\t”+student.getName();
Subject-Subject=dbHelper.getSubject(mark.getSubjectId());
字符串subjectName=subject.getName()+“\t”;
subjectName=subjectName+dbHelper.getTotal(标记);
ArrayList subjects=(ArrayList)markListHashMap.get(全名);
int指数=0;
for(字符串s:主题)
{
字符串s1=s.substring(0,s.indexOf(“\t”);
字符串s2=subjectName.substring(0,subjectName.indexOf(“\t”);
如果(s1==s2)
{
s=s.substring(0,s.indexOf(“\t”);
s=s+subjectName.substring(subjectName.indexOf(“\t”)+1,subjectName.length());
markListHashMap.get(全名).set(索引,s);
}
其他的
索引++;
}
}
您正在获得
由字符串方法引发,以指示索引为负
或大于字符串的大小
问题来自
s.substring(0, s.indexOf("\t")); //this line
s
具有\t
s
具有长度().请确保s1和s2不为null且长度>=0 在比较两个变量(s1和s2)之前,在下一行添加
条件
s1==s2
永远不会为真,因为这两行:
String s1 = s.substring(0, s.indexOf("\t"));
String s2 = subjectName.substring(0, subjectName.indexOf("\t"));
创建不同的String
对象。这些String
对象可能看起来相等(即包含相同的字母),但==
只是比较对象引用。请参阅
出现
StringIndexOutOfBoundsException
的原因在于,如果条件已满(即,如果执行s1.equals(s2)
),则创建结果字符串的方式如下:
这将从s
中获取“\t”
之前的部分,并在subjectName
中的“\t”
之后添加部分,从而有效地删除“\t”
。现在,如果在迭代第二个标记的主题时遇到相同的字符串,则字符串中不再有任何“\t”
,您将获得一个SIOOBE
如果您将其写为:
s = s.substring(0, s.indexOf("\t"));
s = s + subjectName.substring(subjectName.indexOf("\t"), subjectName.length());
但是,由于您之前已经确定s.substring(0,s.indexOf(“\t”))
与subjectName.substring(0,subjectName.indexOf(“\t”)
相同,因此您可以完全跳过它,只需编写
s = subjectName;
如果s.substring(0,s.indexOf(“\t”)
给您一个索引错误,那是因为您的字符串不包含\t
。这不是由equals运算符引起的。s包含“\t”,因为我在一步一步地调试时也会观察它的值,您可以在语句字符串subjectName=subject.getName()+“\t”中看到这一点+0;我确实添加了“\t”然后是另一行抛出异常。它如何在前两行上给你StringIndexOutOfBoundsException
?如果它在第一行上给SIOOBE,第二行将无法到达-如果它在第二行上给SIOOBE,它在第一行上不可能发生…它在第一行上给我SIOOBE如果我使用.equals来比较s1和s2,如果我使用==运算符,我不会得到任何异常,但是即使两个字符串相等,if语句体也不会执行,它们具有相同的长度和相同的值“数学”StringIndexOutOfBoundsException呢?这是主要问题我看到s1和s2值都变成了“数学”了在if语句之前,我正在逐步调试并观察它们的值,但是if语句忽略了它,就好像它们不相等一样,这就是为什么我写了“一个奇怪的问题”谢谢,我发现了这个错误并在不久前修复了它,但我这样修复了它:s=s+“\t”+subjectName.substring(subjectName.indexOf(“\t”)+1,subjectName.length();有时我倾向于把事情过分复杂化
s = s.substring(0, s.indexOf("\t"));
s = s + subjectName.substring(subjectName.indexOf("\t") + 1, subjectName.length());
s = s.substring(0, s.indexOf("\t"));
s = s + subjectName.substring(subjectName.indexOf("\t"), subjectName.length());
s = subjectName;