o1.equals(Object o2)运算符导致错误

时间:2017-04-20 11:20:25

标签: java android

我正在尝试开发一个小型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++;
            }
        }

3 个答案:

答案 0 :(得分:1)

您正在 StringIndexOutOfBoundsException

  

按String方法抛出,以指示索引为负数   或者大于字符串的大小。

来自

的问题
s.substring(0, s.indexOf("\t")); //this line
  1. 确保您的 s 拥有\t
  2. 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;