Java如何验证用户整数输入并解决InputMismatchException异常
问题根因
- 你抛出
InputMismatchException的核心原因是:当Scanner检测到输入流中不存在整数时,错误输入仍然滞留在输入缓冲区里,你没有先清理这部分非法输入就直接调用nextInt()读取,就会触发类型不匹配异常。 - 原有逻辑的内层循环设计错误:进入内层循环的前提已经是当前输入不是整数,你直接调用
nextInt()必然触发异常,也没有实现重复提示直到输入合法的逻辑。
实现方案
不需要用try/catch,调整输入读取逻辑即可:
- 每次检测到非整数输入时,先调用
next()把缓冲区里的非法输入清空,避免重复读取错误内容 - 内层循环仅用来处理当前这一轮的非法输入场景,不会触发外层主循环重走,也就不会重复输出初始的「Enter an integer: 」提示
修正后完整代码
import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner inputScanner = new Scanner(System.in); int counter = 0; boolean run = true; int userInput = 0; while (run) { System.out.print("Enter an integer: "); // 先判断输入是否为整数 if (inputScanner.hasNextInt()) { userInput = inputScanner.nextInt(); } else { // 进入非法输入处理循环,直到拿到合法整数 while (!inputScanner.hasNextInt()) { // 先清空缓冲区的非法输入 inputScanner.next(); System.out.print("You need to enter an Integer: "); } // 拿到合法整数后再赋值 userInput = inputScanner.nextInt(); } System.out.println(userInput); if (counter == 6) { run = false; } counter++; } inputScanner.close(); } }
逻辑说明
- 当用户第一次输入非整数时,会直接进入内层循环,先清掉非法输入,再输出指定的二次提示,直到用户输入合法整数才退出内层循环,整个过程不会触发外层循环的计数增加,也不会重复输出初始的输入提示,完全符合需求。
- 最后补充的
inputScanner.close()是规范的资源释放操作,避免资源泄漏。
内容的提问来源于stack exchange,提问作者csPYTHONcs
相关产品推荐
相关产品推荐

