필자가 작성한 프로그램은 북쪽, 남쪽, 동쪽, 서쪽을 가리키는 직사각형 모양의 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);
}
}
RobotBodyNorth에서 it_rectangle을 삭제하려고했지만 변경하지 않았습니다. RobotBodyNorth에서 직사각형에 슈퍼 (컬러) 값이 할당되어 있다고 생각합니다. public RobotBody turnRight (_rectangle.hide(); _line.hide(); 새로운 RobotBodyEast를 반환합니다 (this); } 이 * RobotBodyNorth 인스턴스의 복사본이 될 새 RobotBodyEast 인스턴스를 만들고이 인스턴스에서 새 인스턴스를 반환하십시오. –
글쎄,'RobotBodyEast' 클래스가 무엇인지 모르겠지만'_rectangle'에 값이 없기 때문에'_rectangle.hide()'와 문제가 있습니다. 이것은'NullPointerException'이 당신이하는 값입니다. 점점. – mgbowen