Do While循环中添加投保人时触发InputMismatchException问题排查
问题排查与解决方案
核心原因
这个问题90%是Scanner输入缓冲区残留换行符导致的:
当第一次循环中使用nextInt()/nextDouble()这类数值读取方法时,它们只会读取输入的数值部分,而你输入完数值后按下的回车(换行符\n)会留在输入缓冲区里。第二次循环调用nextLine()读取姓氏时,会直接读取到这个残留的换行符,导致后续输入逻辑错位,触发InputMismatchException。
解决方案
方案1:读取数值后手动清空缓冲区
每次用nextInt()/nextDouble()读取完数值后,额外调用一次scanner.nextLine()吃掉残留的换行符:
// 示例:读取年龄后清空换行符 int age = scanner.nextInt(); scanner.nextLine(); // 关键:清除缓冲区里的换行符 // 再读取姓氏 String lastName = scanner.nextLine();
方案2:统一用nextLine()读取所有输入(更稳妥)
放弃使用nextInt()/nextDouble(),全部用nextLine()读取输入内容,再手动转换为对应数据类型,彻底避免缓冲区问题:
// 读取年龄字符串并转为int String ageInput = scanner.nextLine(); int age = Integer.parseInt(ageInput); // 直接读取姓氏 String lastName = scanner.nextLine();
方案3:检查循环条件的输入读取逻辑
如果你的Do While循环条件里包含了输入读取操作(比如while(scanner.hasNextInt())),要确保这部分逻辑不会提前消耗掉本该用于读取姓氏的输入,导致后续读取错位。
额外提醒
如果后续仍出现异常,建议在输入读取部分添加异常捕获(比如try-catch包裹Integer.parseInt()),避免用户输入非数值内容时直接崩溃。
内容的提问来源于stack exchange,提问作者donkey_junior
相关产品推荐
相关产品推荐

