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?
нулевая ссылка на конструктор датчика.