Распечатать заявление о замене ввода пользователя - PullRequest
0 голосов
/ 21 мая 2018

У меня есть метод main, а также метод mainMenu.Моя цель - позвонить mainMenu после выполнения main.Если пользовательский ввод не является целым числом, выведите его и вызовите метод mainMenu.

Вот мои два метода:

private static Scanner s = new Scanner(System.in);
public static void main(String[] args) {
    System.out.println("Welcome to Sea Bank!\n");
    try {
        TimeUnit.SECONDS.sleep(2);
    } catch(InterruptedException e) {
        Thread.currentThread().interrupt();
    }
    mainMenu();
}

public static void mainMenu() {
    System.out.println("Please select an item below:");
    System.out.println("(0) Login");
    System.out.println("(1) Create Account");
    System.out.print(">> ");
    try {
        int mainMenu = s.nextInt();
        if (mainMenu == 0) {
            login();
        } else if (mainMenu == 1) {
            System.out.println("coo create acc"); //add in account creation
        }
    } catch(InputMismatchException e) {
        System.out.println("\nPlease enter an integer");
        mainMenu();
    }
}

Так что в основном, когда я вызываю mainMenu метод в main и ввод String вместо int, он возвращает StackOverFlowError вместо повторного запроса пользовательского ввода для int.

    ...
    Please enter an integer
    >> 
    Please enter an integer
    >> 
    Please enter an integer
    >> 
    Please enter an integer
    >> 
    Please enter an integer
    >> Exception in thread "main" java.lang.StackOverflowError
        at java.util.regex.Pattern$CharProperty.match(Pattern.java:3776)
        at java.util.regex.Pattern$Branch.match(Pattern.java:4604)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4227)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
        at java.util.regex.Pattern$Branch.match(Pattern.java:4604)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
        at java.util.regex.Pattern$Ques.match(Pattern.java:4182)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
        at java.util.regex.Pattern$Branch.match(Pattern.java:4604)
        at java.util.regex.Matcher.match(Matcher.java:1270)
        at java.util.regex.Matcher.matches(Matcher.java:604)
        at java.util.Scanner.getCompleteTokenInBuffer(Scanner.java:963)
        at java.util.Scanner.next(Scanner.java:1476)
        at java.util.Scanner.nextInt(Scanner.java:2117)
        at java.util.Scanner.nextInt(Scanner.java:2076)
        at main.bank.seabank.Main.mainMenu(Main.java:35)

Я предполагаю, что пользовательский ввод несколько раз занимаетв "Пожалуйста, введите целое число" вместо того, чтобы разрешить фактический пользовательский ввод.Я просто не совсем уверен, как это исправить.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Я не думаю, что try-catch - лучший способ справиться с подобным выбором.Почему бы вам просто не написать это так:

int mainMenu = s.nextInt();
if (mainMenu == 0) {
    login();
} else if (mainMenu == 1) {
    System.out.println("coo create acc"); //add in account creation
} else {
    mainMenu();
}

Я не уверен на 100%, как это работает, но я думаю, что исключение все еще существует, если приложение не доходит до конца блока catch,Если вы вызовете mainMenu () внутри блока catch, то исключение все равно останется в памяти, поэтому, как только оно войдет в try-catch, оно снова попадет прямо в блок catch.

0 голосов
/ 21 мая 2018

Чтобы избавиться от пользовательского ввода и избежать исключения, в блоке catch добавьте:

s.next();
...