gpt4 book ai didi

Java Lejos 抛出 nullpointerException

转载 作者:行者123 更新时间:2023-12-02 04:09:33 25 4
gpt4 key购买 nike

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 行,它试图从传感器类获取样本。我不知道,我也给出了注释掉的行,它们运行流畅。该错误来自访问传感器类,我无法想出解决方案。

我欠你的情!

最佳答案

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

问题出在这一行:传感器传感器=新传感器(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

// ...
}

对 future 的一些提示:

  • 将您的字段设置为私有(private) - 请参阅 Declaring Member Variables在 Java 教程中
  • 如果字段不允许使用 null 值(例如,当它可能导致 NullPointerException 时),请检查参数中是否存在 null 值,如果存在非法值,则引发异常。
  • 尝试学习调试代码 - 您可能很快就会发现传感器中的字段全部为空,然后您可以再次调试并查看为什么会出现这种情况。要进一步阅读有关 NullPointerExceptions 的内容,我建议 What is a Null Pointer Exception, and how do I fix it? .

关于Java Lejos 抛出 nullpointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33920323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com