JAVA informuje mnie, że metoda która chcę zainicjować jest zainicjonowana. Co ciekawe, w klasie validator jest utworzony obiekt z creditCard, a sam observator przejmuje go do konstruktora. Nie powinen się pruć o za nieinicjonowaną metodę. Przynajmniej tak ja myślę. Cóż, może ktoś odnajdzie błąd. Do oddania projektu zostały mi 3 godziny...
Zastosowane wzorce: state pattern, Observator, kompozytor.
Inicjacja błedu: Próbujesz zainicjować metodę, która jest niezainicjonowana.
Stack Track:
Exception in thread "main" java.lang.NullPointerException
at bankonet.UserObserver.addCounter(UserObserver.java:28)
at bankonet.Validator.isCorect(Validator.java:45)
at bankonet.BankoNET.main(BankoNET.java:38)
Main:
public static void main(String[] args) { IState creditCard = new User (0,"11",false); initSystem init = new initSystem (5000,false); Scanner input = new Scanner(System.in); RunnerApps mainThread = new RunnerApps(); UserObserver observer = new UserObserver(creditCard); Validator valid = new Validator(creditCard); boolean continueApps = true; while(continueApps) { if (observer.checkUser()){ System.out.println("Account is Blocked!!!!!"); } System.out.println("---Szmalcium----"); System.out.println("We are carry your money"); System.out.println("Please insert credic card"); mainThread.run(2000); System.out.println("Please write PIN"); String usedPassword = input.nextLine(); System.out.println("Verify...Please wait"); valid.isCorect(usedPassword); if (valid.getState()) { System.out.println("Conect to bankAccount"); init.run(); if (init.userDecision() && init.run()) { continueApps = false; } } System.out.println("Password is incorect"); } } }
Klasa validator:
public class Validator implements IValidState{ public IState creditCard; private UserObserver observer = new UserObserver(creditCard); private boolean isCorectValid = true; public boolean isIsCorectValid() { return isCorectValid; } public void setIsCorectValid(boolean isCorectValid) { this.isCorectValid = isCorectValid; } public Validator(IState creditCard) { this.creditCard = creditCard; } public void isCorect(String inputPIN) { String usedString = creditCard.getPassword(); if (usedString.equals(inputPIN)) { observer.resetCounter(); } observer.addCounter(); changeState(false); } public boolean getState() { return isIsCorectValid(); } public void changeState(boolean State) { setIsCorectValid(State); }
Klasa userObservator
public class UserObserver { private IState creditCard; public UserObserver(IState creditCard) { this.creditCard = creditCard; } public boolean checkUser(){ if (creditCard.getCounter() == 3){ creditCard.changeState(false); } if (creditCard.checkState()){ return true; } if (!creditCard.checkState()){ return false; } return false; } public void addCounter() // A tu jest błąd. { int nowCounter = creditCard.getCounter(); int afterCounter = nowCounter + 1; creditCard.setCounter(afterCounter); } public void resetCounter(){ creditCard.setCounter(0); } }
Miejsce błędu:
public void addCounter() // tutaj inicjuje { int nowCounter = creditCard.getCounter(); int afterCounter = nowCounter + 1; creditCard.setCounter(afterCounter); } public void resetCounter(){ creditCard.setCounter(0); }
Interfejs IState
public interface IState { public boolean checkState(); public void changeState(boolean State); public int getCounter(); public String getPassword(); public void setCounter(int counter); }
klasa User:
public class User implements IState { private int counter; private String password = ""; private boolean isBlock; public String getPassword() { return password; } public int getCounter() { return counter; } public void setCounter(int counter) { this.counter = counter; } public boolean checkState(){ return isBlock; } public boolean isIsBlock() { return isBlock; } public void setIsBlock(boolean isBlock) { this.isBlock = isBlock; } public void changeState (boolean State){ setIsBlock(State); } User (int counter, String password, boolean isBlock){ this.counter = counter; this.password = password; this.isBlock = isBlock; } }