异常:比较两个不同字符串数组的两个字符串时的java.lang.NullPointerException

时间:2013-08-07 10:34:59

标签: java nullpointerexception arrays compareto

我正在编码通过codingbat.com/java并遇到了一个我不明白的错误。我有两个String数组,想要比较它们。如果我只是使用数组一切正常(但结果不对)。为了得到正确的结果,我编写了一个辅助函数,它消除了数组的所有重复。我测试了辅助函数,它返回了重复数组缩短的数组。

我可以使用_a[i]等检索新数组中的值,但不会出现错误,但如果我使用_a[0].equals(_b[0]) or _a[0].compareTo(_b[0]),我会得到NullPointerException (_a[0] == _b[0] works fine...)

如果我只使用原始数组a,b代码运行没有问题。我不明白为什么我会在那里得到NullpointerException。

感谢您的帮助!

代码:

public int commonTwo(String[] a, String[] b) {

      String[] _a = killDuplicate(a);
      String[] _b = killDuplicate(b);

      int ai=0, bi=0,count=0;

      for (int i = 0; ai < _a.length & bi < _b.length; i++){
         if ( _a[ai].compareTo(_b[bi]) > 0) { //NullPointerException here, but not if I use a,b
            bi++;
         } else if ( _a[ai].compareTo(_b[bi]) < 0){  //NullPointerException here, but not if I use a,b
            ai++;
         } else { 
            count++;
            ai++;
            bi++;
         }  
      }
      return count;
}

辅助功能:

 public String[] killDuplicate(String[] a){

     String temp = "";
     int counter = 0, counter2 = 0;

     for (int i = 0; i < a.length; i++){
        if (! a[i].equals(temp)){
           temp = a[i];
        } else {
           a[i] = "";
           counter++;
        }
     }

     String[] result = new String[a.length - counter];

     for (int i = 0; counter2 < counter; i++){
        if (a[i].equals("")) {
           counter2++;
        }
     } else {
        result[i-counter2] = a[i];
     }
     return result;
 }

1 个答案:

答案 0 :(得分:0)

我猜你假设你的字符串数组已经排序,否则你的killDuplicate方法根本没有意义。

您的代码存在的问题是,在for方法的第二个killDuplicate循环中,您使用条件counter2 < counter进行迭代,该条件表示迭代,直到找到所有找到的重复项。因此,当您找到最后一个副本时,退出而不填充数组的其余部分。尝试使用示例:new String[]{"A", "A", "B", "C"}您将获得[A, null, null]

有许多内容可以改进,但下面对代码进行最简单的修改。 (我只改变了第二个for循环)     public String [] killDuplicate(String [] a){

    String temp = "";
    int counter = 0, counter2 = 0;

    for (int i = 0; i < a.length; i++) {
        if (!a[i].equals(temp))
            temp = a[i];
        else {
            a[i] = "";
            counter++;
        }
    }

    String[] result = new String[a.length - counter];

    for (int i = 0; i < a.length; i++) {
        if (a[i].equals("")) continue;
        result[counter2] = a[i];
        counter2++;
    }

    return result;
}