Java异常处理引发无限循环问题求助
解决Scanner输入错误导致的无限循环问题
嘿,这个坑我刚学Java的时候也踩过!咱们先搞清楚为什么会无限循环,再动手改代码~
问题根源
当你输入非整数内容时,sc.nextInt()会抛出异常,但那个错误的输入并没有被从Scanner的缓冲区里清除掉。下次递归调用data()时,sc.nextInt()会立刻读到缓冲区里残留的无效内容,再次抛出异常,就这样无限循环下去了。
修复方案
在catch块里,先调用sc.nextLine()把缓冲区里的无效输入清空,然后再重新调用data()。这样下次读取的时候,就能获取用户新的输入了。
修改后的代码如下:
static Scanner sc; static double n1; static double n2; static String operation; static void data() { try { System.out.println("Enter first number"); n1 = sc.nextInt(); sc.nextLine(); System.out.println("Enter second number"); n2 = sc.nextInt(); sc.nextLine(); System.out.println("Enter operation you want to perform"); operation = sc.nextLine(); } catch(Exception e) { System.err.println("Wrong data entered!! \n Please enter right data"); // 清空缓冲区里的无效输入 sc.nextLine(); data(); } }
更优雅的写法:提前检查输入(避免异常)
其实我们可以不用依赖异常捕获,而是用sc.hasNextInt()提前检查用户输入是否是整数,这样代码逻辑更清晰,也更高效:
static Scanner sc; static double n1; static double n2; static String operation; static void data() { // 获取第一个数 System.out.println("Enter first number"); while(!sc.hasNextInt()) { System.err.println("Wrong data entered!! \n Please enter right data"); sc.nextLine(); // 清空无效输入 } n1 = sc.nextInt(); sc.nextLine(); // 获取第二个数 System.out.println("Enter second number"); while(!sc.hasNextInt()) { System.err.println("Wrong data entered!! \n Please enter right data"); sc.nextLine(); // 清空无效输入 } n2 = sc.nextInt(); sc.nextLine(); // 获取操作符 System.out.println("Enter operation you want to perform"); operation = sc.nextLine(); }
这种写法用循环代替了递归,也避免了频繁抛出异常的开销,推荐新手尝试~
内容的提问来源于stack exchange,提问作者Deepanshu Sharma
相关产品推荐
相关产品推荐

