0

私はJavaが初めてで、オブジェクトの配列を操作しているときに問題が発生しました。私の主なプログラムは次のようなものです:

package bicycledemo;

class BicycleDemo {
    public static void main(String[] args) {

        // Create two different 
        // Bicycle objects with an array
        Bicycle[] bike = new Bicycle[2];

        bike[0].cadence=50; //line 10, where the NullPointerException prompts out
        bike[0].gear=2;

        bike[1].cadence=10;
        bike[1].gear=3;

        System.out.println("gear: "+bike[0].gear+"\n"+"cadence: "+bike[0].cadence+"\n");
        System.out.println("gear: "+bike[1].gear+"\n"+"cadence: "+bike[1].cadence+"\n");


        System.out.println("\b");
    }
}

Bicycle クラスは次のとおりです。

package bicycledemo;

public class Bicycle {
    public Bicycle() {

    }

    public int cadence;
    public int gear;

}

プログラムを実行すると、出力エラーは次のようになります。

Exception in thread "main" java.lang.NullPointerException
        at bicycledemo.BicycleDemo.main(BicycleDemo.java:10)
Java Result: 1

オブジェクトの自転車が正しく作成されていないことが原因だと思いますが、その理由はわかりません。

ご助力ありがとうございます!私はこれを解決するために本当に必死です!

4

5 に答える 5

4

この行:

Bicycle[] bike = new Bicycle[2];

配列を作成します。これには 2 つの要素があり、どちらの要素も最初は null 参照です。Bicycleオブジェクトを作成していません。次に、次のステートメントで:

bike[0].cadence=50;

...そのnull値を逆参照しようとしています。オブジェクトとして使用する前に、配列の要素を初期化する必要があります。

// Set the first element of the array to refer to a newly created object
bike[0] = new Bicycle();
// Then this will be fine
bike[0].cadence = 50;

ここで何が起こっているのか正確に理解していない場合は、より詳しく調べることが非常に重要です参照とオブジェクトの違いを理解すること (および変数と配列には参照またはプリミティブ値のみが含まれ、オブジェクトは含まれないことを理解すること) は、Java の基本です。それを「理解」するまでは、あらゆる困難に遭遇します。

Bicycleクラスを変更して、ケイデンスとギアをパラメーターとして受け取るコンストラクターを含めることもできることに注意してください。

public Bicycle(int cadence, int gear) {
    this.cadence = cadence;
    this.gear = gear;
}

次に、初期化を次のように変更できます。

bike[0] = new Bicycle(50, 2);
bike[1] = new Bicycle(10, 3);

または配列作成の一部としても:

Bicycle[] bike = {
    new Bicycle(50, 2),
    new Bicycle(10, 3)
};
于 2013-02-24T18:25:53.387 に答える
2

プロパティへのアクセスを開始する前に、配列内の各インデックスを新しいインスタンスに設定する必要があります。

Bicycle[] bike = new Bicycle[2];

bike[0] = new Bicycle(); // add this

bike[0].cadence=50;
...
于 2013-02-24T18:27:17.000 に答える
2

配列要素を初期化したことがないため、配列要素はオブジェクトであるため、デフォルト値 nullに初期化されます。したがって、インデックスで要素を呼び出そうとすると、NPEがスローされます。

    Bicycle[] bike = new Bicycle[2];// initializes the array with size 2
                                       but the elements hold default
                                        values(null in this case)
   bike[0] = new Bicycle();// initializing the array element at index 0
   bike[1] = new Bicycle();// initializing the array element at index 1

もちろん、より良い設計は、2 引数の Bicycle コンストラクターを使用して属性を初期化することです。または、属性のセッターとゲッターを使用することもできます。

  public Bicycle(int cadence, int gear){
        this.cadence = cadence;
        this.gear = gear;
   }

それで、

        bike[0] = new Bicycle(2, 2);
        bike[1] = new Bicycle(3, 5);
于 2013-02-24T18:25:45.647 に答える
2

最初に配列にデータを入力する必要があります。

Bicycle[] bike = new Bicycle[2];
bike[0] = new Bicycle();
bike[1] = new Bicycle();

それ以外の場合は、null 要素だけを含む配列を作成します。

于 2013-02-24T18:25:48.597 に答える
0

オブジェクトの配列を作成し、初期化せずにそれらにアクセスしました。

bike = [null, null] - your result
于 2013-02-24T18:30:38.640 に答える