2012-04-14 4 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

null値で配列を初期化しています。

judgements = new judgement[18425]; 

あなたはnullと比較して値をチェックしていません。 if文を使用する必要があります。

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

       return 0; 
      } 
+0

これは、配列の1要素を埋めるのを忘れていたので、この問題を解決しました。 – orezvani

5

これは、配列がヌルポインタで埋められているためです。コンパレータはヌルオブジェクトを互いに比較することはできません。

アレイを作成しても、アレイの各要素は初期化されません。

+0

が、私は、配列を初期化してきた、私は試しにコードの一部を省略しました – orezvani

+1

ここでそれを短くするために{ //は「判決」配列 を埋める}本当に一つ一つの要素が初期化されていることを確認します。 –

2

compareTo()の実装に関しては、配列にnull以外の要素のみが含まれていることを確認してください。 それ以外の場合、関数compareTo()では、既存の判断で「q」属性を呼び出すと、NullPointerExceptionが発生します。

さらに、タブを避け、コレクションを使用することをおすすめします。 あなたの場合、配列の代わりにTreeSetオブジェクトを使用することができます。なぜなら内部的に要素のcompareTo()メソッドを使用するからです。

+0

あなたは正しいです、私は18425要素を配列に宣言し、18424要素のみを初期化しました。 – orezvani

+0

はい:コレクションを使用する利点は、ハードコードされた配列のサイズにする必要がないことです。 Collectionサブクラスはすべて配列に基づいているので、私は配列と言っています。 Collectionの代わりにArraysを使用した場合の唯一の利点は、JDK 5以前は強力な参照型を持つことができなかったためです。 JDK 5以降、ジェネリックを使うことができます:Set = new TreeSet (); – Mik378

2

おそらく起こっていることは、配列の一部の要素がnullであることです。

compareTo機能にヌルチェックを含めることをお勧めします。 また、現在compareTo関数は機能していません。常に0を返します。これは、すべての項目が等しいと言っているようなものです。

もう1つの問題は、使用しないでください、try{}finally{}を使用しているようです。

関連する問題