0

以下の静的クラスを作成したので、クラスごとにインスタンスを作成しなくても、どのクラスでもlejosロボットのセンサーメソッドにアクセスできます。

ただし、ロボットなどのメソッドを呼び出すとStandardRobot.motorA.setPower(100)クラッシュします。まったく同じクラスを使用してそのローカルインスタンスを作成すると、これは正常に機能します。どうしてこれなの?どちらの場合も、私のコードは正常にコンパイルされ、実行時に失敗します。

import lejos.nxt.*;

public class StandardRobot {

    public static ColorSensor colourSensor;
    public static TouchSensor touchSensor;
    public static UltrasonicSensor ultrasonicSensor;
    public static NXTMotor motorA, motorB;

    public StandardRobot() {
        // instantiate sensors
        ultrasonicSensor = new UltrasonicSensor(SensorPort.S1);
        colourSensor = new ColorSensor(SensorPort.S2);
        touchSensor = new TouchSensor(SensorPort.S4);

        //instantiate motors
        motorA = new NXTMotor(MotorPort.A);
        motorB = new NXTMotor(MotorPort.B);
    }
}
4

4 に答える 4

4

ユーティリティクラスを作成しようとしていますが、変数の初期化はコンストラクターで行われます。

コンストラクターは、インスタンスが...構築されたときにのみ呼び出されます(を介してnew)。

静的プロパティは、静的初期化ブロックで、または宣言されたとおりに静的に初期化する必要があります。

// Initialize static properties as they're declared.
public static ColorSensor colourSensor = new ColorSensor(SensorPort.S2);

// Or initialize in a static initialization block to do them all at once.
public static TouchSensor touchSensor;
// ... and the others.
static {
    touchSensor = new TouchSensor(SensorPort.S4);
    // ... and the others.
}
于 2011-10-25T06:06:37.920 に答える
2

コンストラクターStandardRobotを呼び出さない場合、motorA、motorB、ustrasonicSensorなどをインスタンス化しないため、デフォルトでnullになり、実行時にNullPointerExceptionsが発生します。これらすべてのフィールドをインスタンス変数にするか、静的初期化ブロックの使用を検討することができます。

   static {
 // instantiate sensors
    ultrasonicSensor = new UltrasonicSensor(SensorPort.S1);
    colourSensor = new ColorSensor(SensorPort.S2);
    touchSensor = new TouchSensor(SensorPort.S4);

    //instantiate motors
    motorA = new NXTMotor(MotorPort.A);
    motorB = new NXTMotor(MotorPort.B);
}
于 2011-10-25T06:06:12.677 に答える
2

静的変数は、インスタンスではなく、クラスに対して定義されます。定義するコンストラクターは、クラスではなくインスタンスに対して呼び出されます。その結果、変数が初期化されない可能性があります。

関連ノード:変数を静的にするという考えはあまり良くありません。すべてのロボットが状態を共有するため、ロボットは1つだけに制限します。

于 2011-10-25T06:06:47.183 に答える
0

コンストラクターを静的セクションに置き換えます。

static {
        // instantiate sensors
        ultrasonicSensor = new UltrasonicSensor(SensorPort.S1);
        colourSensor = new ColorSensor(SensorPort.S2);
        touchSensor = new TouchSensor(SensorPort.S4);

        //instantiate motors
        motorA = new NXTMotor(MotorPort.A);
        motorB = new NXTMotor(MotorPort.B);
}
于 2011-10-25T06:09:34.407 に答える