我正在尝试开发一个小型Android应用程序,我遇到了这个相当“奇怪”的问题,我需要比较两个字符串并做一些事情,如果它们匹配,我先使用==运算符,即使是2字符串是相同的,我的if语句将它们视为不相等,只是转到下一个语句(我知道两个字符串是相同的,因为我看着它们的值并逐步调试)。所以我尝试使用.equals运算符,但它在前两个语句中给出了StringIndexOutOfBoundsException:
String s1 = s.substring(0, s.indexOf("\t"));
String s2 = subjectName.substring(0, subjectName.indexOf("\t"));
以下是逐步调试的屏幕截图,s1和s2都有一个值“Mathematics”,但if语句忽略它。 enter image description here
这是一个更“完整”的代码:
if(marks.size() > 0)
{
for(Student student: students)
{
ArrayList<String> subjectNames = new ArrayList<>();
String studentFullName = student.getSurName() + "\t" + student.getName();
studentNames.add(studentFullName);
for(Subject subject: subjects)
{
String subjectName = subject.getName() + "\t" + 0;
subjectNames.add(subjectName);
}
markListHashMap.put(studentFullName, subjectNames);
}
for(Mark mark: marks)
{
Student student = dbHelper.getStudent(mark.getStudentRegister());
String fullName = student.getSurName() + "\t" + student.getName();
Subject subject = dbHelper.getSubject(mark.getSubjectId());
String subjectName = subject.getName() + "\t";
subjectName = subjectName + dbHelper.getTotal(mark);
ArrayList<String> subjects = (ArrayList<String>) markListHashMap.get(fullName);
int index = 0;
for(String s: subjects)
{
String s1 = s.substring(0, s.indexOf("\t"));
String s2 = subjectName.substring(0, subjectName.indexOf("\t"));
if(s1 == s2)
{
s = s.substring(0, s.indexOf("\t"));
s = s + subjectName.substring(subjectName.indexOf("\t") + 1, subjectName.length());
markListHashMap.get(fullName).set(index, s);
}
else
index++;
}
}
答案 0 :(得分:1)
您正在 StringIndexOutOfBoundsException
按String方法抛出,以指示索引为负数 或者大于字符串的大小。
来自
的问题s.substring(0, s.indexOf("\t")); //this line
s
拥有\t
s
长度()而不是 null 。
答案 1 :(得分:0)
请确保s1和s2不为空且长度> gt = 0 在比较两个变量(s1和s2)之前添加以下行
if(s1!=null && s2!=null && s1.length()>=0 && s2.length>=0){
if(s1 == s2){
s = s.substring(0, s.indexOf("\t"));
s = s + subjectName.substring(subjectName.indexOf("\t") + 1, subjectName.length());
markListHashMap.get(fullName).set(index, s);
}
else
index++;
}
答案 2 :(得分:0)
条件s1 == s2
永远不会成立,因为两行:
String s1 = s.substring(0, s.indexOf("\t"));
String s2 = subjectName.substring(0, subjectName.indexOf("\t"));
创建不同的String
个对象。这些String
对象可能看起来相同(即包含相同的字母),但==
只是比较对象引用。见How do I compare strings in Java?
StringIndexOutOfBoundsException
的原因在于,如果条件已满,则创建结果字符串的方式(即如果执行s1.equals(s2)
):
s = s.substring(0, s.indexOf("\t"));
s = s + subjectName.substring(subjectName.indexOf("\t") + 1, subjectName.length());
从"\t"
开始<{>>之前>> s
部分,并在"\t"
之后追加 subjectName
之后的部分 },从而有效地删除"\t"
。现在,如果在为第二个标记迭代subjects
时遇到相同的字符串,则字符串中不再有"\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;