web-dev-qa-db-ja.com

オブジェクトの配列を作成するときのNullPointerException

2つの値を含むクラスの配列を作成しようとしていますが、配列に値を適用しようとすると、NullPointerExceptionが発生します。

public class ResultList {
    public String name;
    public Object value;

    public ResultList() {}
}

public class Test {
    public static void main(String[] args){
        ResultList[] boll = new ResultList[5];
        boll[0].name = "iiii";
    }
}

このエラーが発生するのはなぜですか、どうすれば修正できますか?

31
marjasin

配列を作成しましたが、何も配置しなかったため、5つの要素を含む配列があり、すべてnullです。追加できます

boll[0] = new ResultList();

boll [0] .nameを設定した行の前。

39
Nathan Hughes
ResultList[] boll = new ResultList[5];

size = 5の配列を作成しますが、配列要素は作成しません。

各要素をインスタンス化する必要があります。

for(int i=0; i< boll.length;i++)
    boll[i] = new ResultList();
5
chburd

電話して

 ResultList[] boll = new ResultList[5];

5つのResultListを保持できるリストを作成しました。値を設定する前にboll [0]を初期化する必要があると思います。

boll[0] = new ResultList();
2
ufukgun

以前の回答で多くの人が言ったように、ResultList[] boll = new ResultList[5];は、すべての要素がnullであるサイズ5のResultListの配列を単に作成します。 boll[0].nameを使用している場合、null.nameのようなことを実行しようとしていますが、それがNullPointerExceptionの原因です。次のコードを使用します。

public class Test {
    public static void main(String[] args){
        ResultList[] boll = new ResultList[5];

        for (int i = 0; i < boll.length; i++) {
            boll[i] = new ResultList();
        }

        boll[0].name = "iiii";
   } 
}

ここで、forループは基本的に配列内のすべての要素をResultListオブジェクトで初期化します。forループが完了すると、

boll[0].name = "iiii";
2
class ResultList {
    public String name;
    public Object value;
    public ResultList() {}
}
 public class Test {
    public static void main(String[] args){
    ResultList[] boll = new ResultList[5];
    boll[0] = new ResultList(); //assign the ResultList objet to that index
    boll[0].name = "iiii";  
   System.out.println(boll[0].name);
   }
 }

ResultSetオブジェクトを作成するまで、null参照を指しているすべてのインデックスが空になっているため、nullを取得しています。したがって、そのインデックスにオブジェクトを割り当ててから、値を設定するだけです。

0
Anup

最初に、ResultListタイプの5つの要素を作成しましたが、値を挿入するときに、名前と値を間違って挿入しています。コンストラクタを使用して値を作成し、配列要素に挿入できます。

class ResultList {
    public String name;
    public Object value;
    public ResultList(String name,Object value){
        this.name = name;
        this.value = value;
        System.out.println(name+" --- "+value);
    }
}
public static void main(String[] args) {
        ResultList[] boll = new ResultList[5];
        boll[0] = new ResultList("myName","myValue");
    }
0
arshadImam

さらに、次のようなデバッグ行をクラスに追加することで、これを自分で証明できます。

public class ResultList {
    public String name;
    public Object value;

    public ResultList() {
        System.out.println("Creating Class ResultList");
    }
}

オブジェクトが作成されるたびに、そのコンストラクターの1つを呼び出す必要があります(コンストラクターがない場合は、クラスに既にあるものと同様に、デフォルトのコンストラクターが自動的に作成されます)。コンストラクタが1つしかない場合、オブジェクトを作成する唯一の方法は、そのコンストラクタを呼び出すことです。行の場合

ResultList[] boll = new ResultList[5]; 

実際に5つの新しいオブジェクトを作成すると、デバッグ行がコンソールに5回表示されます。そうでない場合は、コンストラクターが呼び出されていないことがわかります。また、上記の行には開き括弧と閉じ括弧 "()"のパラメーターリストがないため、関数呼び出しまたはコンストラクター呼び出しではないことに注意してください。代わりに、タイプのみを参照しています。 「ResultListオブジェクトの配列、合計5つまでのスペースが必要です。」この行の後は、オブジェクトではなく、空のスペースがあります。

さまざまな修正を試してみると、デバッグ行が目的の結果を得ていることを確認するのに役立ちます。

0
spazBarnum
ResultList p[] = new ResultList[2];

これを記述することにより、2つの要素の配列にスペースを割り当てるだけです。これを実行して、参照変数を初期化する必要があります。

for(int i = 0; i < 2; i++){
    p[i] = new ResultList();
 }
0
Usama Tahir