我正在编写的程序是制作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
表示您尝试访问的变量中没有值,通常是在您尝试调用该变量的方法时。
这也可能是因为您在 RobotBody
和 RobotBodyNorth
中都声明了 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/