Проблема при попытке вернуться в главное меню из подменю Java

#java

#java

Вопрос:

Столкнулся с проблемой возврата в главное меню в моем банковском приложении. Я создал класс под названием menu, который обладает функциональностью для моего приложения и драйвера, который содержит основной метод для запуска программы. Я задаю условие выхода с помощью boolean gobackmainMenu (объявлено в области видимости класса), но как только я ввожу 0 для опции выхода по своему выбору, программа полностью завершается и не возвращается в главное меню. Вот мои фрагменты кода методов, которые я использую. runMenu() вызывается в драйвере (основная функция).

 public void runMenu() {
        printHeader();
        while(!exit) {
            printMenuMM();
            int choice= getInputMainMenu();
            loginRegister(choice);
            
        }
    }
    


  

Выводит меню на консоль

 private void printMenuMM() {
        
        System.out.println("nPlease Make A Selection");
        System.out.println("1)Register");
        System.out.println("2)Login");
        System.out.println("0)Exit");
    }
    private void printMenuCusAccM() {
        System.out.println("nPlease Make A Selection");
        System.out.println("1) Apply for an account");
        System.out.println("2) Deposit in account");
        System.out.println("3) Withdraw from an account");
        System.out.println("4) Transfer Funds");
        System.out.println("0) Logout");
    }
  

Используется для входа в систему и регистрации учетных записей

 private void loginRegister(int choice) {
        Scanner s = new Scanner(System.in);
        UserService userService = new UserService();
        LoginService loginService = new LoginService();
        AccountService accService = new AccountService();
        AuthenticationService aService= new AuthenticationService();
        String username;
        String password;
        String spassword;
        String role1;
        String email;
        Role role;
        String address;
        String fullname;
        boolean enumTypeExists;
        //double amount;
        IntUserDAO userDao = new UserDAO();
        IAccountDAO accDao = new AccountDAO();
        List<User> allUsers =userDao.findAll();
        List<Account>allAccounts=accDao.findAll();
        switch (choice) {
        case 0:
            exit=true;
            break;
        case 1: //Registers a user
            System.out.println("Enter full name: ");
            fullname= s.nextLine();
            
            
            System.out.println("Enter email: ");
            email= s.nextLine();
             
            
            System.out.println("Enter username: ");
            username= s.nextLine(); 
        
            boolean a=userService.usernameExists(username);
            if(a==true) {
                do {
                System.out.println("Username already exists enter in different username");
                System.out.println("Enter username: ");
                username=s.nextLine();
                a=userService.usernameExists(username);
                    
               
                }while(a);
            }
            System.out.println("Enter  password: ");
            password= s.nextLine();
        
            System.out.println("Enter  in account type: ");
            role1=s.nextLine();
            boolean j=aService.enumTypeExists(role1);
            
            if(j==false) {
                do {
                System.out.println("Not a valid account type");
                System.out.println("Enter in account type : ");
                role1=s.nextLine();
                
                j=aService.enumTypeExists(role1);
                    
               
                }while(!j);
            }
            role= Role.valueOf(role1);
            
        
            
            System.out.println("Enter  address: ");
            address= s.nextLine();
            temp    = userService.register(username, password, role, email,fullname, address);
            
            break;
        case 2:// login a user but do some input validation
            System.out.println("Enter login Username: ");
            username =s.nextLine();
            temp=userDao.findByUsername(username);
            
            
            boolean k= aService.usernameAuthentication(username);
            if(k==false) {
                do {
                System.out.println("Username does not exist enter in a valid username");
                System.out.println("Enter username: ");
                username=s.nextLine();
                k=aService.usernameAuthentication(username);
                
               
                }while(!k);
            }
            System.out.println("Enter login Password: ");
            password=s.nextLine();
            boolean m= aService.passwordAuthentication(username,password);
            if(m==false) {
                do {
                System.out.println("Password is not associated with user");
                System.out.println("Enter password: ");
                password=s.nextLine();
                m=aService.passwordAuthentication(username,password);
                
               
                }while(!m);
            }
            
            boolean c=userService.login(username, password);
            while(c) {
                
                if(temp.getRole().toString()=="Customer") {
                    
                    while(!gobackmainMenu) {
                    printMenuCusAccM();
                    int choice2= getInputCusAccM();
                    operonCusAcc(choice2);
                    }
                }
                if(temp.getRole().toString()=="Employee") {
                    printMenuEmpAccM();
                    while(!gobackmainMenu) {
                    int choice3= getInputEmpAccM();
                    operonEmpAcc(choice3);
                    
                    }
                }
                if(temp.getRole().toString()=="Admin") {
                    printMenuAdmAccM();
                    while(!gobackmainMenu) {
                    int choice4= getInputAdmAccM();
                    
                    }
                }
            }
            
            break;
        
            
        default:
            System.out.println("An unknown error has occured");
        }
            
    }
  

Используется для переключения между опциями

 private int getInputMainMenu() {
        Scanner s=new Scanner(System.in);
        int choice=-1;
        while(choice<0 || choice >2) {
            try {
                System.out.print("nEnter your choice: ");
                choice=Integer.parseInt(s.nextLine());
                
            }catch(NumberFormatException e){
                System.out.println("Invalid selection. Please try again");
            }
        }
        return choice;
    }
    private int getInputCusAccM() {
        Scanner s=new Scanner(System.in);
        int choice1=-1;
        while(choice1<0 || choice1 >4) {
            try {
                System.out.print("nEnter your choice: ");
                choice1=Integer.parseInt(s.nextLine());
            }catch(NumberFormatException e){
                System.out.println("Invalid selection. Please try again");
            }
        }
        return choice1;
    }
  

Expected Output

 
***************************************************
            Welcome To The Banking                 
                    App                            
***************************************************

Please Make A Selection
1)Register
2)Login
0)Exit

Enter your choice: 2
Enter login Username: 
k9
Enter login Password: 
k9
Succesful login

Please Make A Selection
1) Apply for an account
2) Deposit in account
3) Withdraw from an account
4) Transfer Funds
0) Logout

Enter your choice: 0

Please Make A Selection
1)Register
2)Login
0)Exit

Enter your choice:
  

Сгенерированный вывод

 ***************************************************
            Welcome To The Banking                 
                    App                            
***************************************************

Please Make A Selection
1)Register
2)Login
0)Exit

Enter your choice: 2
Enter login Username: 
k9
Enter login Password: 
k9
Succesful login

Please Make A Selection
1) Apply for an account
2) Deposit in account
3) Withdraw from an account
4) Transfer Funds
0) Logout

Enter your choice: 0

Please Make A Selection
1)Register
2)Login
0)Exit

  

Завершает программу

Комментарии:

1. Единственный обработчик, который я вижу для 0 наборов exit = true , следовательно, вы выходите с оговорками, что (а) нет представления о runMenu контексте и (б) нужно просмотреть много кода, чтобы понять, как вы пытаетесь обрабатывать ввод верхнего уровня.

Ответ №1:

Что-то происходит внутри метода operonCusAcc() или operonEmpAcc(). Насколько я вижу, у роли администратора нет такого метода.

Если вам нужна дополнительная помощь, пожалуйста, поделитесь дополнительным кодом.

Должно произойти что-то подобное:

 private void operonCusAcc(int choice2) {
    switch (choice2) {
        case 0: runMenu();
        break;
    }
}
  

Ответ №2:

Я думаю, что проблема связана с методом loginRegister(), вы инициализируете сканер при каждом запуске метода, но, похоже, вы не закрываете сканер.
Оно может быть автоматически закрыто с помощью этой конструкции

     try(Scanner s = new Scanner(System.in)) {
        //Your code here
    }
  

Также я рекомендую разделить ваш большой метод на более мелкие, чтобы повысить читаемость и структурировать класс.