2011-03-17 2 views
0

필자가 작성한 프로그램은 북쪽, 남쪽, 동쪽, 서쪽을 가리키는 직사각형 모양의 4 개 로봇을 만드는 것입니다. 4 개의 버튼 (moveForward, moveBackward, turnLeft, turnRight)이 있습니다.디버깅 방법 : 스레드 "AWT-EventQueue-0"예외 java.lang.NullPointerException

실행할 때 moveforward 및 backward 단추를 사용할 수 있지만 turnLeft 및 right는 작동하지 않습니다.

어떻게 수정합니까? 디버거를 읽는 방법?

내가 버튼 클릭 할 때 내가 무엇을 얻을 것입니다 (RobotBodyNorth을 - turnRightButton을 클릭)

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) 

CODE :

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

ROBOTBODY의 등급 (class) :

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

ROBOTBODYNORTH의 클래스 :

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

메인 클래스 : 당신이 RobotBodyNorth 클래스 _rectangle에 값을 할당하지 않는 것처럼

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

것 같습니다. 줄 번호가 없으므로 확신 할 수 없습니다. NullPointerException은 액세스하려는 변수에 값이 없다는 것을 의미하며 대개 메소드를 호출하려고 할 때 사용됩니다.

RobotBodyRobotBodyNorth 모두에 Rectangle _rectangle을 선언했기 때문일 수도 있습니다. Java가 RobotBody에서 상속받은 변수를 숨기고 있다고 생각합니다. 에 RobotBody이 지정되어 있지만 _rectangleRobotBodyNorth에 없습니다. _rectangle (RobotBodyNorth)을 제거하고 도움이되는지 확인해보십시오.

+0

RobotBodyNorth에서 it_rectangle을 삭제하려고했지만 변경하지 않았습니다. RobotBodyNorth에서 직사각형에 슈퍼 (컬러) 값이 할당되어 있다고 생각합니다. public RobotBody turnRight (_rectangle.hide(); _line.hide(); 새로운 RobotBodyEast를 반환합니다 (this); } 이 * RobotBodyNorth 인스턴스의 복사본이 될 새 RobotBodyEast 인스턴스를 만들고이 인스턴스에서 새 인스턴스를 반환하십시오. –

+0

글쎄,'RobotBodyEast' 클래스가 무엇인지 모르겠지만'_rectangle'에 값이 없기 때문에'_rectangle.hide()'와 문제가 있습니다. 이것은'NullPointerException'이 당신이하는 값입니다. 점점. – mgbowen

1

_rectangle을 초기화하지 않았습니다. at RobotBodyNorth.turnRight(RobotBodyNorth.java:55)

관련 문제