Search code examples
javastate-machine

Code implemented according statemachine pattern does not work


I am trying to solve statediagram exercise, but still have not understood why my code does not work.

I chave already cheked all possible code examles of code, but have not understood why mine version does not pass any tests.May be I chve some sort of small mistake which not easy to see. Below I provide my code, test semples and digramms I have.

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

        }
    }

    }

Actually I cann not execute main()

public static void main(String[] args){
        //Motor motor=new Motor();

        GarageDoor gd=new GarageDoor();
        gd.openDoor();
    }

Solution

  • I don't see that you're setting motor anywhere, so in Closed.openDoor, when you call garageDoor.getMotor().upwards() you'll get a NullPointerException.

    Also, I see that you're passing GarageDoor in to the Closed state and then calling garageDoor.setState. Consider just returning the next state from each DoorState method.