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 时,您并没有实例化电机 A、电机 B、超声波传感器等,因此它们默认为 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

静态变量是为类定义的,而不是为实例定义的。您定义的构造函数是为实例调用的,而不是类。结果你的变量可能没有被初始化。

在相关节点上:使变量静态化的想法不是很好。您将自己限制为只有一个机器人,因为所有机器人都会共享状态。

于 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 回答