#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
}
Также я рекомендую разделить ваш большой метод на более мелкие, чтобы повысить читаемость и структурировать класс.