
用 Scanner 读用户输入时,为什么总卡住或跳过输入?
因为 nextLine() 和 nextInt() 等方法对换行符的处理不一致:调用 nextInt() 后,回车留在缓冲区,下一次 nextLine() 会立刻读到空字符串。
- 统一用
nextLine()读所有输入,再手动转类型,比如Integer.parseInt(scanner.nextLine()) - 如果用了
nextInt(),紧接着加一行scanner.nextLine()清掉残留换行符 - 别在循环里反复 new
Scanner(System.in)—— 只需一个实例,重复调用方法即可
怎么用 while 循环控制游戏流程,又不让它死循环?
核心是把「是否继续游戏」和「单轮猜对与否」拆成两个独立判断条件,否则容易逻辑缠绕、退出失控。
- 外层用
while (playAgain)控制整局重开,内层用while (!guessed)控制单局猜测 - 每次猜完必须更新
guessed(猜对设为true)和/或playAgain(比如输入"n"就设为false) - 避免在循环条件里直接写复杂表达式,如
!input.equals("q") || !guessed—— 可读性差,也难调试
Random.nextInt(100) 生成的是 0–99 还是 1–100?
是 0 到 99(含),共 100 个数。如果要猜 1–100,得写 random.nextInt(100) + 1。
- 别用
Math.random() * 100再强转int—— 类型转换易出错,且语义不如Random清晰 - 如果范围可变,封装成方法更安全,比如
nextIntInRange(1, 100),内部做random.nextInt(max - min + 1) + min - 注意
Random实例只需创建一次,重复使用比每次都 new 更高效、也更利于测试
用户输非数字时程序直接崩溃,怎么优雅处理?
抛 InputMismatchException 或 NumberFormatException 是正常现象,关键是怎么接住它,不让整个游戏退出。
立即学习“Java免费学习笔记(深入)”;
- 对
Integer.parseInt()包一层try-catch,捕获NumberFormatException,提示“请输入有效数字”,然后continue下一轮 - 对
Scanner的nextInt()捕获InputMismatchException,并调用scanner.next()清掉非法输入,否则下次还卡在这儿 - 别在 catch 里吞掉异常又不处理输入状态 —— 这是最常见的“看似没报错,实则卡死”原因
实际运行中,最麻烦的不是逻辑,而是输入流状态和异常路径的清理——多一次 nextLine(),少一个 catch 里的 next(),游戏就可能从“无法继续”变成“顺滑体验”。



















