根据状态机模式实现的代码不起作用

时间:2019-07-14 12:31:11

标签: java state-machine

我正在尝试解决状态图练习,但是仍然不明白为什么我的代码不起作用。

我非常想过已经检查了所有可能的代码示例,但是还不明白为什么我的版本没有通过任何测试。可能我正遇到一些不容易看到的小错误。在下面,我提供了我的代码,测试示例和语法。

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

2 个答案:

答案 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();
}