2017-04-20 5 views
-3

Ich versuche, eine kleine Android-App zu entwickeln, und ich stieß auf dieses ziemlich "seltsame" Problem, ich muss zwei Strings vergleichen und wenige Dinge tun, wenn sie übereinstimmen, habe ich verwendet == operator first, und selbst wenn die 2 Strings identisch waren, behandelt meine if-Anweisung sie als nicht gleich und geht einfach weiter zu nächsten Anweisungen (Ich weiß, dass die zwei Strings gleich sind, weil ich ihre Werte beobachte und Schritt für Schritt debugge). Also habe ich versucht .equals Operator stattdessen zu verwenden, aber es ist mir geben StringIndexOutOfBoundsException auf den beiden vorherigen Aussagen, die sind:o1.equals (Objekt o2) Operator verursacht Fehler

String s1 = s.substring(0, s.indexOf("\t")); 
String s2 = subjectName.substring(0, subjectName.indexOf("\t")); 

Hier ist ein Screenshot von Schritt-für-Schritt-Debugging, die beide s1 und s2 einen Wert " Mathematik "aber die if-Anweisung ignoriert es. enter image description here

Hier ist ein "vollständiger" Code:

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

Wenn 'sstring (0, s.indexOf (" \ t "))' Ihnen einen Indexfehler gibt, liegt das daran, dass Ihre Zeichenfolge nicht '\ t' enthält. Es wird nicht verursacht durch ** den Gleichheitsoperator. – khelwood

+0

s enthält "\ t", weil ich auch während des Debuggens Schritt für Schritt auf seinen Wert schaue, und das sieht man in der Anweisung String subjectName = subject.getName() + "\ t" + 0; Ich habe "\ t" hinzugefügt. – Taivna

+0

Dann ist es eine andere Zeile, die die Ausnahme auslöst. – khelwood

Antwort

0

Sie erhalten StringIndexOutOfBoundsException

Geworfen von String-Methoden, um anzuzeigen, dass ein Index ist entweder negativ oder größer als die Größe der Zeichenfolge.

Problem von

s.substring(0, s.indexOf("\t")); //this line 
  1. Stellen Sie sicher, Ihre s mit \t
  2. s mit Länge() und nicht null kommen.

.

+1

Was ist mit der? StringIndexOutOfBoundsException was ist das Hauptproblem – AMB

0

Bitte stellen Sie sicher, s1 und s2 nicht null ist und mit einer Länge von> = 0 unterhalb Zeile hinzufügen, bevor beide Variablen zu vergleichen (s1 und 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++; 
    } 
+0

Ich sehe beide s1 und s2 Werte werden "Mathematik" vor der if-Anweisung beim Debuggen Schritt für Schritt und beobachten ihre Werte, aber die if-Anweisung ignoriert es, als ob sie nicht gleich sind, deshalb schrieb "ein seltsames Problem" – Taivna

0

Die Bedingung s1 == s2 wird nie wahr sein, da die zwei Linien:

String s1 = s.substring(0, s.indexOf("\t")); 
String s2 = subjectName.substring(0, subjectName.indexOf("\t")); 

erstellen verschiedene String Objekte. Diese String Objekte können gleich erscheinen (d. H. Dieselben Buchstaben enthalten), aber == vergleicht nur Objektverweise. Siehe How do I compare strings in Java?


Der Grund für die StringIndexOutOfBoundsException ist in der Weise, dass Sie Ihre resultierenden String erstellen, wenn die Bedingung erfüllt ist (dh, wenn Sie s1.equals(s2) tun):

s = s.substring(0, s.indexOf("\t")); 
s = s + subjectName.substring(subjectName.indexOf("\t") + 1, subjectName.length()); 

Dies nimmt die Teil vor die "\t" von s und fügt den Teil nach die "\t" von subjectName an, wodurch dieeffektiv entfernt wird.Jetzt, wenn die gleiche Zeichenfolge beim Iterieren subjects für die zweite Marke angetroffen wird, gibt es keine "\t" in Ihrer Zeichenfolge und Sie erhalten eine SIOBE.

Es würde nicht passieren, wenn Sie es schreiben waren wie:

s = s.substring(0, s.indexOf("\t")); 
s = s + subjectName.substring(subjectName.indexOf("\t"), subjectName.length()); 

Aber, da Sie zuvor nur festgestellt, dass s.substring(0, s.indexOf("\t")) die gleiche wie subjectName.substring(0, subjectName.indexOf("\t")) ist, könnten Sie dies ganz überspringen und schreiben nur

s = subjectName; 
+0

Danke, ich habe diesen Fehler gefunden und es vor einiger Zeit behoben, aber ich habe es so korrigiert: s = s + "\ t" + subjectName_string (subjectName.indexOf ("\ t") + 1, subjectName.length()); Ich neige dazu, manchmal Dinge zu komplizieren: D – Taivna

Verwandte Themen