do-while循环捕获异常问题及Java程序修复请求
解决do-while循环捕获InputMismatchException后无限循环的问题
我来帮你拆解这个问题的根源,再给出具体的修复方案:
为什么会无限循环?
当你输入非整数(比如字母、符号或者中文)时,Scanner.nextInt()没办法解析这个输入,这个无效的输入会一直留在Scanner的输入缓冲区里。之后每次循环执行key.nextInt()时,都会重复读取到这个没被处理的无效输入,不断触发InputMismatchException,导致程序一直在输出"Invalid",根本没机会让你输入新内容。
怎么修复?
核心就是在捕获异常后,把缓冲区里的无效输入清空,这样下一次循环时Scanner才能接收新的输入。具体来说,在catch块里添加key.nextLine()语句,它会把缓冲区里剩余的所有字符(包括换行符)都读取掉,清空缓冲区。
另外我给你加了一点交互提示,让用户更清楚该输入什么,体验更好。
修复后的完整代码
import java.util.*; import java.io.*; public class test { public static void main(String[] args) { Scanner key = new Scanner(System.in); boolean clear; int in = 0; do { clear = true; try { System.out.print("请输入一个整数:"); in = key.nextInt(); } catch (InputMismatchException e) { System.out.println("Invalid输入,请输入一个有效的整数!"); clear = false; // 清空缓冲区中的无效输入,避免无限循环 key.nextLine(); } } while (!clear); String stringIn = Integer.toString(in); String[] dec = stringIn.split(""); for (int i = 1; i < dec.length; i++) { System.out.print(dec[i] + " "); } } }
小补充
如果你的无效输入里包含空格,用key.next()只会读取到空格前的部分,没法彻底清空缓冲区,所以用key.nextLine()是更稳妥的选择,能一次性处理掉整行的无效输入。
内容的提问来源于stack exchange,提问作者crmurs
相关产品推荐
相关产品推荐

