我正在尝试解决状态图练习,但是仍然不明白为什么我的代码不起作用。
我非常想过已经检查了所有可能的代码示例,但是还不明白为什么我的版本没有通过任何测试。可能我正遇到一些不容易看到的小错误。在下面,我提供了我的代码,测试示例和语法。
https://drive.google.com/open?id=1SQAiwUBo1OwI-QKksxciDS7dEdKGS6dn [1] https://drive.google.com/open?id=1JhdScK7t1XmNc3eLT7hSGpwyYDLWl46T [2]
public class GarageDoor {
private Motor motor;
private DoorState currentState;
public GarageDoor() {
this.setState(new Closed(this));
//currentState=new Closed(this);
}
public void openDoor(){
currentState.openDoor();
}
public void stopper(){
currentState.stopper();
}
public void closeDoor(){
currentState.closeDoor();
}
public Motor getMotor(){
return this.motor;
}
private void setState(DoorState ds){
this.currentState=ds;
}
public abstract class DoorState{
public abstract void openDoor();
public abstract void closeDoor();
public abstract void stopper();
}
public class Closed extends DoorState{
private GarageDoor garageDoor;
public Closed(GarageDoor garageDoor){
this.garageDoor=garageDoor;
}
@Override
public void openDoor() {
garageDoor.setState(new Opening(garageDoor));
garageDoor.getMotor().upwards();
}
@Override
public void closeDoor() {
throw new IllegalStateException();
}
@Override
public void stopper() {
throw new IllegalStateException();
}
}
}
实际上我无法执行main()
public static void main(String[] args){
//Motor motor=new Motor();
GarageDoor gd=new GarageDoor();
gd.openDoor();
}
答案 0 :(得分:0)
我看不到您在任何地方设置了motor
,因此在Closed.openDoor
中,当您致电garageDoor.getMotor().upwards()
时会得到NullPointerException
。
此外,我看到您正在将GarageDoor
传递到Closed
状态,然后调用garageDoor.setState
。考虑只从每个DoorState
方法返回下一个状态。
答案 1 :(得分:0)
1)尝试让GarageDoor扩展DoorState,似乎覆盖了相同的方法。
2)您实际上没有在GarageDoor
类中创建Motor。
您需要启动电动机,例如:
public GarageDoor() {
this.motor = new Motor();
}