2

プログラムを短くするために、配列とループを使用してタスクを実行していますが、問題があります。配列の初期化が間違っているのか、アクセスが間違っているのかわかりません。40 個の JCheckBox の配列を初期化しています。

JCheckBox[] seatz={chk_a1,chk_a2,chk_a3,chk_a4,chk_a5,chk_a6,chk_a7,chk_a8,chk_a9,chk_a10,chk_b1,chk_b2...chk_d10};

JCheckBox の項目の状態が変更されるたびに、seatChecker()メソッドが呼び出されます

public void seatChecker(JCheckBox chkbox) {
    if(chkbox.isSelected()){
        chkboxcount=chkboxcount+1;
    } else {
        chkboxcount=chkboxcount-1;
    }
    if(chkboxcount>=totalseats){
        disableSeats();
    } else {
        enableSeats();
    }
}

ここでは、カウントが特定の制限に達した場合は JCheckBox を無効にし、それ以外の場合は有効にしています。2 つのメソッドのコードは次のとおりです。

    public void disableSeats() {
    for(int x = 0; x < 40 ; x++) {
        if(seatz[x].isSelected()==false){
            seatz[x].setEnabled(false);
        }
    }
}

public void enableSeats() {
    for(int x = 0; x < 40 ; x++) {
        seatz[x].setEnabled(true);
    }
}

エラーが表示Exception in thread "AWT-EventQueue-0" java.lang.NullPointerExceptionされif(seatz[x].isSelected()==false)seatz[x].setEnabled(true)ここで何が間違っていますか?

4

1 に答える 1

5

あなたは次のように述べています:

エラーが表示Exception in thread "AWT-EventQueue-0" java.lang.NullPointerExceptionされif(seatz[x].isSelected()==false)seatz[x].setEnabled(true)ここで何が間違っていますか?

これは、seatz[x] が null の場合にのみ発生します。

参照型の配列 (ここでは JCheckBox) を宣言しているように見えますが、使用する前に各配列項目に対して有効な非 null オブジェクトをまだ構築していません。それらを使用しようとする前に、最初に有効な非 null オブジェクトへの参照で配列を埋める必要があります。これは、参照型の配列でも同じです。

別の見方をすると、オブジェクトの配列を作成するときは、卵のパックを作成するようなものです。最初にカートンに卵を入れるまで、卵を使用することはできません. 初期化する前に配列内のオブジェクトを使用することはできません。これは多くの場合、for ループ内で行われます。

つまり、最初にこれを行う必要があります:

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

配列内のアイテムを使用する前に。


余談ですが、これを見ると:

40 個の JCheckBox の配列を初期化しています。

JTable の方がニーズに適しているかどうか疑問に思っています。


JTable を使用できない場合は、次のコードに注意してください。

JCheckBox[] seatz={chk_a1,chk_a2,chk_a3,chk_a4,chk_a5,chk_a6,chk_a7,chk_a8,chk_a9,chk_a10,chk_b1,chk_b2...chk_d10};

次のように簡単に変更できます。

JCheckBox[][] seats = new JCheckBox[4][10]; // magic numbers replaced by constants
for (int row = 0; row < seats.length; row++) {
  for (int col = 0; col < seats[row].length; col++) {
    seats[row][col] = new Seat();
    seatPanel.add(seats[row][col]);
  } 
}
于 2013-08-11T02:12:32.100 に答える