Ввод сканера с обработкой исключений в try / catch работает не так, как предполагалось

#java

#java

Вопрос:

Я создаю программу atm, которая принимает номер счета и PIN-код. Когда я пытаюсь ввести что-либо, кроме принятых учетных записей и пин-кодов, которые предопределены, предполагается, что он выдает сообщение об ошибке, и пользователь пытается снова. Единственная проблема заключается в том, что он выводит сообщение об ошибке, но переходит к следующему вводу вместо повторения предыдущего ввода. т.Е. Переходит от ввода номера счета к вводу PIN-кода. То же самое происходит и для pin-кода. Я действительно не знаю, что с этим делать. Заранее спасибо! Вот фрагмент моего кода:

 import java.util.*;
import java.lang.*;

public class Menu {

   Scanner input = new Scanner(System.in);
   //Bank bank = new Bank();
   boolean keepGoing = true;

   public static void main(String[] args){
     Menu menu = new Menu();
     menu.startMenu();

   }//end main
   
   public void startMenu(){
    int choice = 0;
    int verify1 = 0;
    int verify2 = 0;
    int account = 0;
    int pin = 0;
    printGreet();
    while(keepGoing){
    System.out.print("Please enter Account number: ");
     do{
     try{
      account = input.nextInt();
      }//end try
     catch(NumberFormatException e){
      System.out.print("ERROR: That is not a valid account number. Please enter a valid account number (#####): ");
      input.nextLine();//clear buffer
      }//end catch
     catch(InputMismatchException e){
      System.out.print("Error: That is not a valid account number. Please enter a valid account number (#####): ");
      input.nextLine();//clear buffer 
      }//end catch
     if(account < 0 || account > 99999){
      System.out.print("ERROR: That is not a valid account number. Please enter a valid account number (#####): ");
      //input.nextLine();//clear buffer
      }//end if
     }while(!(account >= 0 amp;amp; account <= 99999));//end do/while
     System.out.print("Please enter PIN number: ");
     do{
     try{
      pin = input.nextInt();
      }//end try
     catch(NumberFormatException e){
     System.out.print("ERROR: That is not a valid pin number. Please enter a valid pin number (#####): ");
     input.nextLine();//clear buffer
      }//end catch
     catch(InputMismatchException e){
      System.out.print("ERROR: That is not a valid pin number. Please enter a valid pin number (#####): ");
      input.nextLine();//clear buffer
      }//end catch
     if(pin < 0 || pin > 99999){
      System.out.print("ERROR: That is not a valid pin number. Please enter a valid pin number (#####): ");
      //input.nextLine();//clear buffer
      }//end if
    }while(!(pin >= 0 amp;amp; pin <= 99999));//end do/while
    verify1 = verifyAccount(account);
    verify2 = verifyPin(pin);
    if((verify1 == 1) amp;amp; (verify2 == 1)){
     printAdminMenu();
     choice = getAdminChoice();
     adminChoices(choice);
    }else if((verify1 == 2) amp;amp; (verify2 == 2)){
     printUserMenu();
     choice = getUserChoice();
     userChoices(choice);
    }else{
     System.out.println("ERROR: YOU ARE NOT AN AUTHORIZED USER...GOODBYE");
     System.exit(0);
    }//end if/else
   }//end while
  }//end startMenu()

  

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

1. Вы разрешаете учетную запись и pin-код, когда они есть >= 0 , но изначально они равны нулю, а поскольку ноль — это значение, которое вы принимаете, оно переходит к следующему элементу. Инициализируйте их -1 , если ноль действительно является допустимым значением для PIN-кода и номера учетной записи.

2. Кроме того, вам не нужно import java.lang.*; java.lang пакет импортируется по умолчанию во все программы Java.

Ответ №1:

Время только проверяет, является ли номер учетной записи недействительным. При возникновении ошибки синтаксического account pin анализа переменная / остается 0 неизменной, поэтому она не повторяется.

Я исправил / улучшил код для вас. Обратите внимание, что вы всегда должны отлаживать свой код, прежде чем задавать вопрос о StackOverflow.

 public void startMenu() {
    int account = 0;
    int pin = 0;

    printGreet();

    while (keepGoing) {
        System.out.print("Please enter Account number: ");

        boolean invalid;

        do {
            invalid = false;

            try {
                account = input.nextInt();

                // Cancel if the number is invalid
                if (account < 0 || account > 99999) {
                    throw new NumberFormatException();
                }
            } catch (NumberFormatException | InputMismatchException e) {
                System.out.print("ERROR: That is not a valid account number. Please enter a valid account number (#####): ");
                input.nextLine();

                // Mark the loop iteration as invalid
                invalid = true;
            }
        } while (invalid);

        System.out.print("Please enter PIN number: ");

        do {
            invalid = false;

            try {
                pin = input.nextInt();

                // Cancel if the number is invalid
                if (pin < 0 || pin > 99999) {
                    throw new NumberFormatException();
                }
            } catch (NumberFormatException | InputMismatchException e) {
                System.out.print("ERROR: That is not a valid pin number. Please enter a valid pin number (#####): ");
                input.nextLine();

                invalid = true;
            }
        } while (invalid);

        verify1 = verifyAccount(account);
        verify2 = verifyPin(pin);
        
        if ((verify1 == 1) amp;amp; (verify2 == 1)) {
            printAdminMenu();
            choice = getAdminChoice();
            adminChoices(choice);
        } else if ((verify1 == 2) amp;amp; (verify2 == 2)) {
            printUserMenu();
            choice = getUserChoice();
            userChoices(choice);
        } else {
            System.out.println("ERROR: YOU ARE NOT AN AUTHORIZED USER...GOODBYE");
            System.exit(0);
        }
    }
}