替换用户输入的打印语句



我有一个main方法和一个mainMenu方法。我的目标是在执行main后调用mainMenu。如果用户输入不是整数,则打印它必须是整数并调用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();
}
}

所以基本上当我在main中调用mainMenu方法并输入一个字符串而不是一个 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)

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

要摆脱用户输入并避免异常,请在 catch 块中添加:

s.next();

我不认为 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 块的末尾,否则异常仍然存在。如果你在 catch 块内调用 mainMenu((,异常仍将在内存中,因此一旦它进入 try-catch,它就会再次直接进入 catch 块。

最新更新