Java Lejos выдает исключение nullpointerException

Привет пользователям Stackru. Это связано с Java, а не с самим роботом. То, что я пытался сделать, это отделить датчики от методов перемещения, чтобы сделать код легко читаемым, но я столкнулся с одной проблемой.

Sensor.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;
    }

}

Movement.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, где она пытается получить образец из класса датчиков. Понятия не имею, я также дал закомментированные строки, которые бегло работают. Ошибка происходит от доступа к классу датчиков, и я не могу придумать решение.

Я буду в вашем долгу!

2 ответа

Решение

Ах, мне понадобилось время, чтобы поймать это.

Проблема в этой строке: Sensors sensors = new Sensors(touchSensor, colorSensor, gyroSensor, ultrasonicSensor);

Вы написали эту инициализацию после конструктора, но, тем не менее, sensors будет назначен до того, как вы инициализируете свои поля в конструкторе. Таким образом, объект Sensors будет создан только с нулевыми значениями, и при вызове 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 все равно null, тогда вы можете снова выполнить отладку и посмотреть, почему это так. Для дальнейшего чтения об исключениях NullPointerException я рекомендую Что такое исключение нулевого указателя и как его исправить?,

Движение класса, объект EV3ColorSensor определяется в конструкторе.... какой класс использует объект Movement?

нулевая ссылка на конструктор датчика.

Другие вопросы по тегам