Java中mainMenu输入非整数引发StackOverflowError问题求助
解决Scanner输入非整数导致StackOverflowError的问题
嘿,我知道你为啥遇到这个StackOverflowError了!问题出在Scanner的输入缓冲区没有被清空上:当你输入非整数触发InputMismatchException后,那个错误的输入(比如你输入的字符串)还留在Scanner的缓冲区里,并没有被消费掉。所以每次你递归调用mainMenu()时,s.nextInt()都会立刻读取到同一个错误输入,再次触发异常,无限递归下去,最终把调用栈撑爆,就出现了StackOverflowError。
修复方案
在catch块里,添加一行s.nextLine()来清空缓冲区里的错误输入(包括换行符),这样下一次调用nextInt()时就能等待用户的新输入了。修改后的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"); // 清空缓冲区里的错误输入,避免重复读取 s.nextLine(); // 重新调用菜单 mainMenu(); } }
更稳妥的替代方案:用循环代替递归
递归调用虽然简单,但如果用户多次输入错误,还是有栈溢出的潜在风险。换成while循环来实现重复提示会更安全,示例代码如下:
public static void mainMenu() { boolean validInput = false; while (!validInput) { 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(); validInput = true; // 输入有效,退出循环 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"); s.nextLine(); // 清空错误输入 } } }
这样不管用户输入多少次错误,都不会出现栈溢出的问题啦!
内容的提问来源于stack exchange,提问作者John Antonio Anselmo
相关产品推荐
相关产品推荐

