java - 如何调试: Exception in thread "AWT-EventQueue-0" java. lang.NullPointerException

标签 java eclipse nullpointerexception

我正在编写的程序是制作4个机器人,其形状为矩形,有一条线指向北、南、东、西。有 4 个按钮(前进、后退、左转、右转)。

当我运行它时,我可以让前进和后退按钮起作用,但左转和右转不起作用。

如何修复它?以及如何读取调试器?

这就是我点击按钮时得到的结果 (RobotBodyNorth - 单击右转按钮)

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at RobotBodyNorth.turnRight(RobotBodyNorth.java:55)
    at Robot.turnRight(Robot.java:40)
    at TurnRightButton.mouseClicked(TurnRightButton.java:21)
    at wheels.etc.DrawingPanel$MouseClick.mouseClicked(DrawingPanel.java:157)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$2.run(Unknown Source)
    at java.awt.EventQueue$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

代码:

public class Robot {
    private RobotBody _robotBody;

    public Robot (RobotBody robotBody){
        _robotBody = robotBody;
    }   
    public Color getColor(){
        return _robotBody.getColor();
    }
    public void moveBackward(){
        _robotBody.moveBackward();
    }
    public void moveForward(){
        _robotBody.moveForward();
    }
    public void moveLine() {
        _robotBody.moveLine();
    }
    public RobotBody turnLeft(){
        _robotBody = _robotBody.turnLeft();
        return _robotBody;
    }
    **public RobotBody turnRight(){
        _robotBody = _robotBody.turnRight();
        return _robotBody;
    }**
}

机器人主体类别:

public abstract class RobotBody {
    protected Rectangle _rectangle;
    protected int _diameter, _centerX, _centerY;
    private Color _color;

    public RobotBody(Color color){
        _diameter = 30;
        _color = color;

        _rectangle = new Rectangle(_color){
            @Override
            public void mouseClicked( MouseEvent e ){
                RobotBody.this.mouseClicked( e );
            }
        };

        _rectangle.setColor(_color);
        _rectangle.setSize(_diameter,_diameter);
        _rectangle.setFrameThickness(1);
        _rectangle.setFrameColor(Color.BLACK);

         int x = (int)(400.0 * Math.random());
         int y = (int)(400.0 * Math.random());
            _centerX=x;
            _centerY=y;
            setCenter(_centerX,_centerY);
    }

    public RobotBody (RobotBody oldBody){   
        this._color = oldBody._color;
        this._diameter = oldBody._diameter;
        this.setCenter(oldBody._centerX, oldBody._centerY);
        getColor();

        _rectangle = new Rectangle(_color){
            @Override
            public void mouseClicked( MouseEvent e ){
                RobotBody.this.mouseClicked( e );
            }
        };
        _rectangle.setColor(_color);
        _rectangle.setSize(_diameter,_diameter);
        _rectangle.setFrameThickness(1);
        _rectangle.setFrameColor(Color.BLACK);
    }

    public Color getColor(){
        return _color;
    }

    public void setCenter(int x, int y) {
        _centerX=x;
        _centerY=y;
        _rectangle.setLocation(x-(_diameter/2),y-(_diameter/2));
    }

    public void mouseClicked( MouseEvent e ){
        int newX = (int)(400.0 * Math.random());
        int newY = (int)(400.0 * Math.random());
        setCenter( newX, newY );
        moveLine();
    }

    public abstract void moveLine();
    public abstract void moveBackward();
    public abstract void moveForward();
    public abstract RobotBody turnLeft();
    **public abstract RobotBody turnRight();**

    protected Color contrastWith( Color color ){
        if( colorLuminance( color ) < 0.5 )
            return Color.WHITE;
            return Color.BLACK;
    }
    protected double colorLuminance( Color color ){
        int    red   = color.getRed();
        int    green = color.getGreen();
        int    blue  = color.getBlue();
        double lum   = ((float)(red + green + blue)) / 765.0;
        return lum;
    }
}

ROBOBODYNORTH 级:

public class RobotBodyNorth extends RobotBody{
    protected Rectangle _rectangle;
    private Line _line;
    private Color _color;
    private Color _c;

    public RobotBodyNorth(Color color){
        super(color);
        _line = new Line(_centerX,_centerY,_centerX,_centerY-(_diameter/2));
        _c=contrastWith(color);
        _line.setColor(_c);
    }

    public RobotBodyNorth(RobotBody oldBody){
        super(oldBody);
        _line = new Line(_centerX,_centerY,_centerX,_centerY-(_diameter/2));
        _c=contrastWith(_color);
        _line.setColor(_c);
    }

    public void moveBackward(){
        int _newCenterX = _centerX;
        int _newCenterY = _centerY + _diameter/2;
        setCenter( _newCenterX, _newCenterY);
        moveLine();
    }

    public void moveForward(){
        int _newCenterX= _centerX;
        int _newCenterY = _centerY - _diameter/2;
        setCenter( _newCenterX, _newCenterY);
        moveLine();
    }

    public RobotBody turnLeft(){
        _rectangle.hide();
        _line.hide();
        return new RobotBodyWest(this);
    }

    **public RobotBody turnRight(){
        _rectangle.hide();
        _line.hide();
        return new RobotBodyEast(this);
    }**

    @Override
    public void moveLine(){
        _line.setPoints(_centerX,_centerY,_centerX,_centerY-(_diameter/2));
    }
}

主要类(class):

public class Main {

    public static void main(String[]args){
        new Arena();

        RobotBodyNorth r1 = new RobotBodyNorth(Color.RED);
        Robot North = new Robot(r1);
        new ControlButtons(0, 0, North);
    }
}

最佳答案

您似乎没有为 RobotBodyNorth 类中的 _rectangle 赋值。由于我没有行号,所以我不能确定。 NullPointerException 表示您尝试访问的变量中没有值,通常是在您尝试调用该变量的方法时。

这也可能是因为您在 RobotBodyRobotBodyNorth 中都声明了 Rectangle _rectangle。我相信 Java 隐藏了从 RobotBody 继承的变量。虽然 RobotBody 中的 _rectangle 已赋值,但 RobotBodyNorth 中的 _rectangle 并未赋值。尝试删除 RobotBodyNorth 中的 _rectangle 并查看是否有帮助。

关于java - 如何调试: Exception in thread "AWT-EventQueue-0" java. lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5333740/

相关文章:

java - Netbeans 7.1 运行旧代码而不是新代码

java - 如何在java项目中调用不同类的方法

c++ - 如何使用 Eclipse 和 CDT 使用 MinGW 编译和运行 C++?

java - 如何用java制作沙盒游戏

java.lang.NullPointerException | java.lang.NullPointerException我的时钟不工作

java - 将另一个项目的资源文件发布到上下文路径而不是eclipse中的jar文件

java - 如何在Java中将XML内容写入字符串?

java - 栈数组

android - 更新 sdk 得到了 zxing 的 NoClassDefFoundError

java - 使用 mysql PrepareStatement 取消引用可能的空指针警告