0

你好 StackOverflow 用户。这与 Java 而不是机器人本身有关。我试图做的是将传感器与运动方法分开,以使代码易于阅读,但我遇到了一个问题。

传感器.java

package sensors;

import lejos.hardware.sensor.EV3ColorSensor;
import lejos.hardware.sensor.EV3GyroSensor;
import lejos.hardware.sensor.EV3TouchSensor;
import lejos.hardware.sensor.EV3UltrasonicSensor;

public class Sensors {

    EV3TouchSensor touchSensor;
    EV3ColorSensor colorSensor;
    EV3GyroSensor gyroSensor;
    EV3UltrasonicSensor ultrasonicSensor;

    public Sensors(EV3TouchSensor t, EV3ColorSensor c, EV3GyroSensor g, EV3UltrasonicSensor u) {
        touchSensor = t;
        colorSensor = c;
        gyroSensor = g;
        ultrasonicSensor = u;
    }

    public int getColorSample(){
        int sample = colorSensor.getColorID();
        return sample;
    }

}

运动.java

public class Movement {

    RegulatedMotor left;
    RegulatedMotor right;
    EV3TouchSensor touchSensor;
    EV3ColorSensor colorSensor;
    EV3GyroSensor gyroSensor;
    EV3UltrasonicSensor ultrasonicSensor;

    public Movement(RegulatedMotor l, RegulatedMotor r, EV3TouchSensor t,  EV3ColorSensor c, EV3GyroSensor g,
            EV3UltrasonicSensor u) {
        left = l;
        right = r;
        touchSensor = t;
        colorSensor = c;
        gyroSensor = g;
        ultrasonicSensor = u;
    }

    //initialize sensors

    Sensors sensors = new Sensors(touchSensor, colorSensor, gyroSensor, ultrasonicSensor);

    public void moveForward() {
        // get the color sample of the ground
        //int sample = colorSensor.getColorID();
        int sample = sensors.getColorSample();

        // while machine is on the ground color
        while (sample != 7) {

            // get new sample
            //sample = colorSensor.getColorID();
            sample = sensors.getColorSample();

            // move forward
            syncForward();
        }
        // if on black, stop motors.
        syncStop();
    }

不要看其他方法,因为这些方法运行流畅,但错误出现在第 30 行,它试图从传感器类中获取样本。我不知道,我也给出了注释掉的行,它们可以流畅地工作。该错误来自访问传感器类,我想不出一个解决方案。

我会欠你的!

4

2 回答 2

2

啊,我花了一段时间才明白这一点。

问题是这一行: Sensors sensors = new Sensors(touchSensor, colorSensor, gyroSensor, ultrasonicSensor);

您已经在构造函数之后编写了此初始化,但无论如何,sensors将在您初始化构造函数中的字段之前分配。这样,Sensors将创建一个只有 null 值的对象,并且在调用 时sensors.getColorSample(),类int sample = colorSensor.getColorID();中的Sensors行将抛出 NullPointerException。

要修复它,请尝试Movement像这样更改类:

public class Movement {

    RegulatedMotor left;
    RegulatedMotor right;
    EV3TouchSensor touchSensor;
    EV3ColorSensor colorSensor;
    EV3GyroSensor gyroSensor;
    EV3UltrasonicSensor ultrasonicSensor;

    // like in your code, sensors is still a field, but won't be initialized yet
    Sensors sensors;

    public Movement(RegulatedMotor l, RegulatedMotor r, EV3TouchSensor t,  EV3ColorSensor c, EV3GyroSensor g,
            EV3UltrasonicSensor u) {
        left = l;
        right = r;
        touchSensor = t;
        colorSensor = c;
        gyroSensor = g;
        ultrasonicSensor = u;

        // here is the initialization of sensors - at this point, the arguments shouldn't be null anymore (unless they are passed as null to the constructor)
        sensors = new Sensors(touchSensor, colorSensor, gyroSensor, ultrasonicSensor);
    }

    public void moveForward() {
        // this method should be okay, you don't need to change it

        // ...
    }

对未来的一些提示:

  • 创建您的字段private- 请参阅Java 教程中的声明成员变量
  • 如果某个字段不允许使用空值(例如,当它可能导致 NullPointerException 时),请检查您的参数是否有空值,如果存在非法值则抛出异常。
  • 试着学习调试你的代码——你可能很快就发现你的字段sensors都是空的,然后你可以再次调试,看看为什么会这样。有关 NullPointerExceptions 的进一步阅读,我推荐什么是 Null 指针异常,以及如何修复它?.
于 2015-11-25T15:34:15.113 回答
0

Movement,对象EV3ColorSensor在构造函数中定义....哪个类正在使用Movement 对象?

对传感器构造函数的空引用。

于 2015-11-25T15:35:29.453 回答