Java中While循环结合Try-Catch处理输入异常的问题
解决玩家选择循环的无效输入问题
我太懂你遇到的这个坑了——当用户输入非整数内容时,循环直接“卡壳”无限输出错误提示,根本不给用户重新输入的机会对吧?这是因为Scanner.nextInt()读取失败后,那些无效的输入字符还留在输入缓冲区里,下一次循环它又会重复读取这些垃圾内容,导致死循环。
下面是修复后的代码,我会一步步给你解释改动点:
import java.util.InputMismatchException; import java.util.Scanner; public class PlayerSelector { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int player; boolean playerCreated = false; while (!playerCreated) { // 简化写法,!playerCreated比playerCreated == false更简洁直观 try { System.out.print("请选择玩家1或玩家2:"); player = scan.nextInt(); if (player != 1 && player != 2) { throw new IllegalArgumentException("输入的数字不是1或2"); } playerCreated = true; System.out.println("成功选择玩家" + player); } catch (InputMismatchException e) { // 关键操作:清空输入缓冲区里的无效内容 scan.nextLine(); System.out.println("错误:请输入有效的整数!"); } catch (IllegalArgumentException e) { System.out.println("错误:" + e.getMessage()); } } scan.close(); // 记得用完关闭Scanner释放资源 } }
核心改动说明:
- 精准捕获异常:不再用笼统的
Exception,而是分别捕获InputMismatchException(非整数输入时抛出)和自定义的IllegalArgumentException(数字不在1/2范围内时抛出),能更清晰地区分不同类型的错误。 - 清空输入缓冲区:在捕获到非整数输入的异常时,调用
scan.nextLine()把缓冲区里的无效字符(比如字母、符号、换行符)全部清空,这样下一次循环scan.nextInt()才能正常读取用户的新输入。 - 优化错误提示:给用户明确的反馈,告诉他们具体哪里错了、该输入什么,提升交互体验。
- 简化代码写法:
!playerCreated是Java里更常用的布尔判断写法,读起来更顺畅。
这样修改后,不管用户输入字母、符号还是不在1-2范围内的数字,程序都能正确处理,让用户重新输入,不会再出现循环“失效”的情况。
内容的提问来源于stack exchange,提问作者Karlov
相关产品推荐
相关产品推荐

