Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java o1.equals(对象o2)运算符导致错误_Java_Android - Fatal编程技术网

Java o1.equals(对象o2)运算符导致错误

Java o1.equals(对象o2)运算符导致错误,java,android,Java,Android,我正在尝试开发一个小的android应用程序,我遇到了一个相当“奇怪”的问题,我需要比较两个字符串,如果它们匹配,我需要做一些事情,我首先使用==运算符,即使这两个字符串相同,我的if语句也会将它们视为不相等,然后继续下一个语句(我知道这两个字符串是相等的,因为我观察它们的值并一步一步地调试)。因此我尝试使用.equals运算符,但在前面的两条语句中,它给了我StringIndexOutOfBoundsException,这两条语句是: String s1 = s.substring(0, s.

我正在尝试开发一个小的android应用程序,我遇到了一个相当“奇怪”的问题,我需要比较两个字符串,如果它们匹配,我需要做一些事情,我首先使用==运算符,即使这两个字符串相同,我的if语句也会将它们视为不相等,然后继续下一个语句(我知道这两个字符串是相等的,因为我观察它们的值并一步一步地调试)。因此我尝试使用.equals运算符,但在前面的两条语句中,它给了我StringIndexOutOfBoundsException,这两条语句是:

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;