




Scanner读取输入时卡住或跳过是因为nextInt()等不消费换行符,nextLine()会读到残留\n;应统一用nextLine()后解析,或在nextInt()后加nextLine()清缓存。
Scanner 读取用户输入时为什么总卡住或跳过?常见现象是第一次输入后,后续 nextLine() 直接返回空字符串。这是因为 nextInt()、nextDouble() 等方法不消费换行符,而 nextLine() 会立刻读到残留的 \n。
实操建议:
nextLine() 读取所有输入,再用 Integer.parseInt() 转数字nextInt(),紧跟着加一句 scanner.nextLine() 清缓冲区Scanner 对象——它底层持有一个输入流,重复创建可能引发资源异常Java 8+ 推荐用 ThreadLocalRandom.current().nextInt(1, 101),它线程安全、无需初始化、性能好。老写法 new Random().nextInt(100) + 1 每次都新建对象,浪费;而 Math.random() 返回 double,需强制转且精度冗余。
关键点:
nextInt(a, b) 是左闭右开区间,所以 nextInt(1, 101) 才能覆盖 1–100 全部整数Random.nextInt(100) 然后 +1,虽然结果对,但多一次对象分配Random 实例可复用,但 ThreadLocalRandom 不需要保存引用while 循环控制游戏流程而不陷入死循环?核心是把「是否继续」和「单局猜对与否」拆成两个独立状态变量,否则容易逻辑缠绕。典型错误是只靠一个 isGuessed 控制整个外层循环,导致无法重开新局。
推荐结构:
while (playAgain) 控制是否重玩while (!isGuessed) 控制单局猜测过程isGuessed = false 和计数器(如 attempts = 0)break 跳出内层循环,再设 playAgain = false
InputMismatchException 崩溃?直接调 nextInt() 遇到字母就会抛异常。不能靠 try-catch 包裹整个游戏主循环——那会让错误处理和业务逻辑混在一起。
更干净的做法:
hasNextInt() 预检,返回 false 时调 nextLin
e() 清掉非法输入continue 进入下一轮循环边界情况容易被忽略:用户连续输三次“abc”,程序得稳定吞掉它们,而不是在第二次就因残留字符出错。每次非法输入后,务必调一次 nextLine()。