应捕获inputmismatchexception并用next()清空缓冲区,再提示重试;可封装safenextint等方法复用;也可用hasnextint()预判类型;读整行时建议nextline()配合split()和parseint()处理。

用 Scanner 读取控制台输入时,类型不匹配(比如要整数却输了个字母)会抛出 InputMismatchException,程序直接中断。关键不是“避开异常”,而是主动捕获、提示用户重试,并清空错误输入缓存——否则会陷入死循环。
基础读取 + 异常捕获:避免程序崩溃
Scanner 的 nextInt()、nextDouble() 等方法在输入不符合预期类型时,不会跳过错误内容,而是把非法输入留在缓冲区里。下次再调用同样方法,它还会读到那个错的值,反复报错。
正确做法是:捕获异常后,用 next() 清掉当前无效的 token:
- 先 try 调用
scanner.nextInt() - catch
InputMismatchException时,立刻执行scanner.next()(丢弃非法输入) - 再提示用户重新输入,循环继续
封装安全读取方法:提升复用性
重复写 try-catch 太啰嗦,建议为常用类型封装带校验的静态方法。例如:
-
safeNextInt(Scanner sc, String prompt):打印提示语,持续读直到拿到合法 int - 内部逻辑 = while 循环 + try-catch + next() 清缓存 + break 成功时
- 同理可做
safeNextDouble、safeNextBoolean等
用 hasNextXxx() 预判类型:更轻量的防御方式
如果不想用异常机制,可用 hasNextInt()、hasNextDouble() 先判断下一个输入是否符合目标类型:
- 若返回 true,再调用
nextInt()安全获取 - 若 false,调用
next()清掉当前项,再提示重输 - 注意:
hasNextXxx()不会移动扫描器位置,也不消耗输入,适合需要“试探性读取”的场景
处理字符串中的数字:避免被空格/回车干扰
用户可能输“ 123 ”或“456\n”,用 next() 会自动跳过前后空白并读到下一个完整 token;而 nextLine() 读整行,含空格但不含换行符。
若需严格按行解析(比如一行多个值),建议:
- 用
nextLine()读整行,再用String.split()拆分 - 对每个子串用
Integer.parseInt()转换,并捕获NumberFormatException - 这样比混合用
nextXXX()和nextLine()更可控,避免换行符残留问题










