2016-09-06 1 views
-3

Okay, ich verstehe, was eine NPE ist, und warum sie verursacht werden (die meiste Zeit), aber ich kann nicht herausfinden, warum das passiert.NPE beim Versuch, replaceAll() auf ArrayList <String>

Ich habe eine ArrayList von Strings, die definitiv nicht leer ist, weil ich jedes Element zuvor in einem ListView angezeigt habe.

Ich verwende einen benutzerdefinierten Vergleicher:

public static class NumericalPodcastSort implements Comparator<String> { 

     @Override 
     public int compare(String o1, String o2) { 
      return extractInt(o1) - extractInt(o2); 
     } 

     int extractInt(String s) { 
      String num = s.replaceAll("\\D", ""); << This is where the NPE is occurring. 
      // return 0 if no digits found 
      return num.isEmpty() ? 0 : Integer.parseInt(num); 
     } 
    } 

den ganzzahligen Teil von jeder Saite zu sortieren, in absteigender Reihenfolge (1, 2, 3, etc.), wie gezeigt here

Hier Ich mache die Formatierung und Sortierung der ArrayList, bevor ich sie zurückschicke und anderswo benutze.

public ArrayList<String> formatMindhiveTitles(ArrayList<String> arrayList) { 

    ArrayList<String> formattedTitles = new ArrayList<>(); 

    for (int i = 0; i < arrayList.size(); i++) { 

     String title = arrayList.get(i); 

     formattedTitles.add(StringUtils.substringBetween(title, "mindhive podcast/", ".mp3")); 
    } 

    if (!formattedTitles.isEmpty()) { 
     Collections.sort(formattedTitles, new FragmentUtilities.NumericalPodcastSort()); 
     return formattedTitles; 
    } 

    return new ArrayList<>(); 
} 

Ich habe den Collections.sort() Anruf um zu verschiedenen Orten gemischt, aber ich

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.replaceAll(java.lang.String, java.lang.String)' on a null object reference 

ich immer erhalten entschuldige mich, wenn dies eine einfache Lösung, aber für das Leben von mir, ich kann nicht arbeiten, warum das passiert. Es ist kein Problem von mir mit ArrayList<String> anstelle von List<String> ist es? Ich sollte nicht denken, aber ich bin mir nicht sicher.

+3

Überprüfen Sie in 'extractInt()' vor dem Ersetzen den Wert von 's'. Es ist wahrscheinlich null – TheLostMind

+0

Ich weiß, dass es null ist, deshalb lege ich den Kommentar dort. Aber "s" wird in der Methode 'compare()' zugewiesen, die die Strings in der ArrayList sortieren soll, die ich an 'Collections.sort (list, myComparator)' übergebe. Was ich nicht verstehe ist, wie ist die Liste, die ich übergebe, die null Werte enthält? –

+0

Anstatt down voting, sag mir, was ich falsch mache. Ich habe Stunden damit verbracht, das Internet zu durchsuchen und SO zu versuchen, dies selbst zu beantworten. Gib mir eine Pause. –

Antwort

1

StringUtils.substringBetween() gibt mehrere Fälle an, in denen null zurückgegeben wird. Vermutlich führt das dazu, dass Nullwerte zu Ihrer formattedTitles-Liste hinzugefügt werden, was wiederum eine NPE in Ihrer extractInt()-Methode verursacht.

Verwandte Themen