2012-04-14 100 views
0

我正在编写一个代码来从文件中读取一些记录并以特殊方式对它们进行排序。我想这样的代码:Java错误:java.lang.NullPointerException

public class Main { 

    static class judgement implements Comparable<judgement> { 
     public int q; 
     public int d; 
     public int r; 

     public int compareTo(judgement j) { 
      int k = ((judgement) j).q; 
      return 0; 
     } 
    } 

    public static void method() throws Exception { 
     judgement[] judgements; 
     judgements = new judgement[18425]; 
     try { 
      // fill the "judgements" array 
     } finally { 
      Arrays.sort(judgements); 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     method(); 
    } 

}

但我得到的功能的compareTo错误NullPointerException异常。有人可以帮我解决这个问题吗?

回答

2

您正在初始化具有空值的数组。

judgements = new judgement[18425]; 

而你没有检查空值与之比较。你必须使用if语句。

public int compareTo(judgement j) { 
      int k =0; 
    if(j!=null){ 
    k = ((judgement) j).q; 
    } 

       return 0; 
      } 
+0

它解决了这个问题,因为我忘了填写数组的一个元素。 – orezvani 2012-04-14 20:00:40

5

这是因为数组填充了空指针。比较器无法将空对象相互比较。

创建数组不会初始化数组的每个元素。

+0

但我已经初始化了数组,我刚刚在这里省略了一部分代码尝试{ //填充“判断”数组 }使其缩短为 – orezvani 2012-04-14 19:52:07

+1

确保每个元素都被初始化。 – 2012-04-14 19:55:07

2

请确保数组中只有非null元素与您的compareTo()的实现有关。 否则,在您的函数compareTo()中,在假定的现有判断中调用“q”属性会导致NullPointerException。

此外,避免制表符,更喜欢使用集合。 就你而言,你可以使用TreeSet对象而不是数组,因为它们内部使用了元素的compareTo()方法。

+0

你说得对,我已经在数组中声明了18425个元素并初始化了18424个元素。 – orezvani 2012-04-14 19:57:11

+0

是:)使用集合的好处是您不需要硬编码数组的大小。我在说数组是因为Collection子类都是基于数组的。我发现使用数组而不是集合的唯一好处是因为在JDK 5之前,我们不能拥有强大的引用类型。从JDK 5起,我们可以使用泛型:Set = new TreeSet (); – Mik378 2012-04-14 19:59:24

2

可能发生的情况是您阵列中的某些元素是null

在您的compareTo函数中包含一个空检查是一种很好的做法。 另外,现在您的compareTo函数不起作用:它总是返回0 - 这就像是说所有项目都是平等的。

您的其他问题是,它看起来像你正在使用try{}finally{}不应该使用的东西。

相关问题