Random.nextInt(100)生成0–99,猜数字需用nextInt(100)+1;while循环推荐while(true)+if(break);Scanner需hasNextInt()校验并next()清错;Random应单例复用。

Random.nextInt() 生成范围容易写错
很多人以为 Random.nextInt(100) 能生成 1–100,其实它返回的是 0 到 99(含)的整数。猜数字游戏要求是 1–100,直接用会漏掉 100,也多出 0 这个非法值。
- 正确写法是
random.nextInt(100) + 1:先取 0–99,再整体右移一位 - 别用
random.nextInt(1, 101)—— Java 17+ 才支持双参数重载,老版本直接编译报错:cannot resolve method nextInt(int, int) - 如果目标范围不固定(比如用户自定义上下限),记得校验
min < max,否则nextInt(max - min)可能传负数,抛出IllegalArgumentException
while 循环终止条件常把「等于」漏掉
玩家输入刚好等于答案时,游戏该结束,但很多人写成 while (guess != answer) 是对的;错在内部逻辑里提前 break 或 continue 没对齐,或者把判断写反了。
- 典型错误:用
while (guess < answer || guess > answer)—— 看似等价,实则冗余且易读性差,还可能因短路逻辑埋隐患 - 更危险的是写成
while (guess == answer),导致一次都进不去循环 - 建议统一用
while (!isCorrect)配合布尔变量,或直接用while (true)+ 内部if (guess == answer) break;,逻辑更直白,调试时也容易插日志
Scanner 输入非数字时程序直接崩溃
Scanner.nextInt() 遇到字母或空行会卡住并抛 InputMismatchException,新手常没包 try-catch,一输错就退出。
- 必须用
scanner.hasNextInt()先探测,再调nextInt(),否则流位置错乱,后续读取全乱 - 输错后要手动“吃掉”非法 token:调一次
scanner.next(),否则下轮循环还会读到同一个错值 - 如果允许用户输“quit”退出,得先检查字符串再转数字,不能无脑
nextInt()
重复创建 Random 实例导致随机数重复
在循环里每轮都 new Random(),尤其在毫秒级快速输入时,种子相同,nextInt() 返回一串完全相同的数 —— 玩家连猜十次全是 42。
立即学习“Java免费学习笔记(深入)”;
-
Random实例应该只创建一次,作为类成员变量或 main 方法里的局部常量 - 不要用
Math.random()替代 —— 它底层也是共享 Random 实例,但没法控制种子,也不如显式 Random 好调试 - 真要每次不同种子?用
new Random(System.nanoTime()),但普通猜数字没必要,反而增加复杂度
边界、异常、实例生命周期这三处,改起来就几行代码,但漏掉任何一个,游戏要么玩不了,要么玩着玩着就“假死”或“一直猜同一个数”。实际写的时候,盯着这三点看一遍,基本就稳了。



















