Как отладить: Исключение в потоке "AWT-EventQueue-0" java.lang.NullPointerException - PullRequest
0 голосов
/ 17 марта 2011

Я пишу программу для создания 4 роботов прямоугольной формы с линией, указывающей на север, юг, восток, запад. Есть 4 кнопки (MoveForward, MoveBackward, TurnLeft, TurnRight).

Когда я запускаю его, я могу заставить работать кнопки «Вперед» и «Назад», но TurnLeft и Right не работают.

Как мне это исправить? и как мне прочитать отладчик?

Это то, что я получаю, когда нажимаю кнопку (RobotBodyNorth - нажал кнопку TurnRight)

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

РОБОТБИНОРТОВЫЙ КЛАСС:

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));
    }
}

ГЛАВНЫЙ КЛАСС:

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);
    }
}

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

Похоже, вы не присваиваете значение _rectangle в классе RobotBodyNorth. Поскольку у меня нет номеров строк, я не уверен. NullPointerException означает, что в переменной, к которой вы пытаетесь обратиться, нет значения, обычно, когда вы пытаетесь вызвать метод для нее.

Это также может быть связано с тем, что вы объявили Rectangle _rectangle в RobotBody и RobotBodyNorth. Я считаю, что Java скрывает переменную, унаследованную от RobotBody. В то время как _rectangle в RobotBody присваивается значение, _rectangle в RobotBodyNorth нет. Попробуйте удалить _rectangle в RobotBodyNorth и посмотрите, поможет ли это.

1 голос
/ 17 марта 2011

Вы не инициализировали _rectangle.at RobotBodyNorth.turnRight(RobotBodyNorth.java:55)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...