如何用try/catch+while循环验证整数输入?UNO游戏玩家数校验问题
搞定UNO游戏玩家数量的输入校验问题
嘿,我来帮你解决这个输入校验的麻烦!先说说你当前代码里的两个核心问题:
players != (int)players完全没用:你定义的players已经是int类型了,把一个int强制转成int还是它本身,这个判断永远不会成立,所以非整数输入的情况根本不会被这个逻辑捕获到。- 无限循环的根源:当用户输入字母或符号时,
s.nextInt()会抛出InputMismatchException,但此时输入缓冲区里的无效字符并没有被清空——下一次循环调用nextInt()时,还是会读到这些垃圾内容,继续抛出异常,直接陷入死循环。
接下来给你一个靠谱的实现方案,用try/catch结合while循环,同时搞定非整数输入和玩家数量必须在2-4之间的校验:
import java.util.InputMismatchException; import java.util.Scanner; public class UNOGame { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int playerCount = 0; boolean isInputValid = false; while (!isInputValid) { try { System.out.print("请输入玩家数量(仅限2-4人):"); playerCount = scanner.nextInt(); // 校验玩家数量范围 if (playerCount < 2 || playerCount > 4) { System.out.println("哎呀,只能是2到4个玩家哦,请重新输入!"); } else { isInputValid = true; // 输入有效,跳出循环 System.out.println("完美!玩家数量设置为:" + playerCount); // 这里可以调用你的checkPlayers逻辑 // checkPlayers(playerCount); } } catch (InputMismatchException e) { // 专门捕获非整数输入的异常 System.out.println("不对哦,必须输入整数,请重新来!"); scanner.nextLine(); // 重中之重:清空输入缓冲区的无效内容 } } scanner.close(); } }
几个关键细节要注意:
- 精准捕获
InputMismatchException:比起用通用的Exception,专门捕获这个异常更清晰,因为它就是nextInt()遇到非整数时抛出的特定异常。 scanner.nextLine()清空缓冲区:这是解决无限循环的核心!抛出异常后,输入缓冲区里的无效字符(比如你输入的字母"abc")还留在那里,必须用nextLine()把它读出来扔掉,不然下一次nextInt()会重复读取这些内容,继续报错。- 用布尔变量控制循环:只有当输入是合法整数且在2-4范围内时,才把
isInputValid设为true,结束循环。 - 删掉那个无效的判断:
players != (int)players完全没必要,直接移除就好。
如果你坚持想用自定义异常的写法,也可以调整,但对于这种简单的输入校验,上面的写法已经足够简洁好用啦。
内容的提问来源于stack exchange,提问作者K. Olofson
相关产品推荐
相关产品推荐

