如何解决Java中的NullPointerException?

时间:2018-10-06 03:22:57

标签: java arrays nullpointerexception

所以我有一个文本文件,其中包含导入到程序中的一串字符串,程序要做的是寻找第一个重复字符串的第一个索引:

hasFeature

和我用来查找重复项的第一个索引的方法如下:

static final int NOT_FOUND = -1;
dupeIndex = indexOfFirstDupe( wordList, wordCount );
    if ( dupeIndex == NOT_FOUND )
        System.out.format("No duplicate values found in wordList\n");
    else
        System.out.format("First duplicate value in wordList found at index %d\n",dupeIndex);

问题是我收到此错误:

enter image description here

这是一个static int indexOfFirstDupe( String[] arr, int count ) { Arrays.sort(arr); int size = arr.length; int index = NOT_FOUND; for (int x = 0; x < size; x++) { for (int y = x + 1; y < size; y++) { if (arr[x].equals(arr[y])) { index = x; break; } } } return index; ,据我了解,这意味着我的字符串数组(?)中基本上存在一个空值。我有没有简单的解决方案?可能改写我的方法?

3 个答案:

答案 0 :(得分:0)

假设您的诊断正确无误

  

...这意味着我的字符串数组中基本上存在一个空值...

...我可以想到两种解决方法。

  1. 摆脱数组中的null引用。完全删除它们,或将其替换为"""null"或其他无害的东西。

  2. Arrays.sort方法的重载带有第二个参数:Comparator。因此,您可以做的是实现一个Comparator来处理null而不抛出NPE。 (例如,它可以将null视为小于所有非空字符串。)

以下是处理null的示例比较器:

    public class NullSafeStringComparator implements Comparator<String> {
        public int compare(String s1, String s2) {
            if (s1 == s2) {
                return 0;
            } else if (s1 == null) {
                return -1;
            } else if (s2 == null) {
                return 1;
            } else {
                return s1.compareTo(s2);
            }
        }
    }

或者,对于Java 8和更高版本,您可以按以下方式构建一个:

    Comparator.nullsFirst(Comparator.naturalOrder())            

答案 1 :(得分:0)

该错误是由Array.sort(arr);

引起的

根据Java文档(https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#sort-java.lang.Object%3aA-):

根据对象元素的自然顺序将指定的对象数组升序排列。 数组中的所有元素必须实现Comparable接口

排序很可能在String数组的null对象上调用compareTo方法时,很可能引发了异常。

一个简单的直接解决方案是确保您的String数组中没有空对象...

答案 2 :(得分:0)

有一种更好的方法来做您想做的事。 这是复杂度O(n),而您的复杂度是O(n ^ 2)+排序失败。

  public int indexOfFirstDup(String[] arr) {
    Set<String> valuesFound = new HashSet<>();
    for (int i=0;i<arr.length; i++) {
      String s = arr[i];
      // ignore nulls
      if (s == null) { continue; }
      if (valuesFound.contains(s)) {
        // here we identified a duplication and we can leave 
        return i;
      } else {
        valuesFound.add(s);
      }
    }
    // no dups
    return -1;
   }

请注意,代码尚未经过编译或测试-这只是一个想法!