打印声明替换用户输入

时间:2018-05-21 14:17:41

标签: java exception try-catch user-input

我有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)

我假设用户输入重复进入"请输入一个整数"而不是允许实际的用户输入。我不太确定如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

我不认为尝试捕捉是处理此类选择的最佳方法。为什么不这样写呢:

builder.inheritIO();

我不是100%确定它是如何工作的,但我认为除非应用程序到达catch块的末尾,否则异常仍然存在。如果你在catch块中调用mainMenu(),异常仍然会在内存中,所以一旦它进入try-catch,它就会直接进入catch块。