尝试在ArrayList <string>上调用replaceAll()时的NPE

时间:2016-09-06 05:48:42

标签: java android sorting arraylist

好的,我了解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>不是问题吗?我不应这么认为,但我不确定。

1 个答案:

答案 0 :(得分:1)

StringUtils.substringBetween()指定了几种返回null的情况。据推测,这会导致空值被添加到您的formattedTitles列表中,从而导致extractInt()方法中的NPE。