好的,我了解NPE是什么,以及它们(大部分时间)是由它引起的,但我无法弄清楚为什么会发生这种情况。
我有一个字符串的ArrayList,它绝对不是空的,因为我之前一直在ListView中显示每个元素。
我正在使用自定义比较器:
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);
}
}
按降序排列每个String的整数部分(1,2,3等),如图here所示
这是我在返回ArrayList并在其他地方使用它之前对ArrayList进行格式化和排序的地方。
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<>();
}
我已将Collections.sort()
电话转移到几个不同的地方,但我不断收到
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
如果这是一个简单的解决方案,我道歉,但对于我的生活,我无法弄清楚为什么会发生这种情况。我使用ArrayList<String>
代替List<String>
不是问题吗?我不应这么认为,但我不确定。
答案 0 :(得分:1)
StringUtils.substringBetween()
指定了几种返回null的情况。据推测,这会导致空值被添加到您的formattedTitles
列表中,从而导致extractInt()
方法中的NPE。