Java中do-while循环失效求助:输入y无法重新进入循环
解决Do-While循环无法重新启动游戏的问题
嘿,我太懂你这种踩坑的感觉了!你遇到的这个问题,大概率是两个常见的小坑导致的:一是do-while循环的终止条件没设置到位,二是Scanner输入时的换行符残留坑,这俩在写Java控制台交互程序时特别容易中招!
先看你的代码片段,你只写了do块的开头,没把while条件和后续的playAgain输入逻辑放出来,但根据我碰到过的无数类似问题,我给你梳理下问题根源和解决办法:
问题根源
假设你原本的代码是这么写的(很多新手都会这么写):
do { // 猜数字的逻辑 System.out.println("Guess a number between 1 - 100: "); guessNumber = scan.nextInt(); // ... 省略猜数字的判断逻辑 ... System.out.println("Play again? (y/n)"); playAgain = scan.nextLine(); // 这里就是坑! } while (playAgain.equalsIgnoreCase("y"));
当你用scan.nextInt()读取数字时,它只会读取数字本身,而你输入数字后按下的回车键(也就是换行符)会留在输入缓冲区里。接下来调用scan.nextLine()的时候,它会直接读取这个残留的换行符,导致playAgain变成空字符串,自然没法满足equalsIgnoreCase("y")的循环条件,程序直接退出了。
另外还有个小细节:你的theNumber变量现在是在do循环外面定义的,这样每次重新玩游戏都是同一个数字,体验也不好,应该把它移到do循环里面!
解决方案
给你两种靠谱的解决办法,选哪种都行:
办法一:吃掉残留的换行符
在nextInt()之后,加一个额外的scan.nextLine()把缓冲区里的换行符吃掉,再读取用户的“是否重玩”输入:
import java.util.Scanner; public class HiLo { public static void main(String[] args) { String playAgain = ""; Scanner scan = new Scanner(System.in); do { // 每次重玩都生成新的随机数 int theNumber = (int)(Math.random() * 100 + 1); int guessNumber = 0; System.out.println("Guess a number between 1 - 100: "); // 猜数字的循环 while (guessNumber != theNumber) { guessNumber = scan.nextInt(); if (guessNumber > theNumber) { System.out.println("Too high! Try again."); } else if (guessNumber < theNumber) { System.out.println("Too low! Try again."); } else { System.out.println("You got it! The number was " + theNumber); } } // 吃掉nextInt留下的换行符,避免影响后续输入 scan.nextLine(); System.out.println("Play again? (y/n)"); playAgain = scan.nextLine(); } while (playAgain.equalsIgnoreCase("y")); scan.close(); System.out.println("Thanks for playing!"); } }
办法二:全程用nextLine读取输入
这种方法更稳妥,全程用scan.nextLine()读取输入,再把输入的字符串转换成整数,从根源上避免换行符残留的问题,还能顺便处理用户输入非数字的情况:
import java.util.Scanner; public class HiLo { public static void main(String[] args) { String playAgain = ""; Scanner scan = new Scanner(System.in); do { int theNumber = (int)(Math.random() * 100 + 1); int guessNumber = 0; System.out.println("Guess a number between 1 - 100: "); while (guessNumber != theNumber) { // 读取整行输入 String input = scan.nextLine(); try { guessNumber = Integer.parseInt(input); if (guessNumber > theNumber) { System.out.println("Too high! Try again."); } else if (guessNumber < theNumber) { System.out.println("Too low! Try again."); } else { System.out.println("You got it! The number was " + theNumber); } } catch (NumberFormatException e) { // 处理用户输入非数字的情况 System.out.println("Oops, please enter a valid integer between 1-100!"); } } System.out.println("Play again? (y/n)"); playAgain = scan.nextLine(); } while (playAgain.equalsIgnoreCase("y")); scan.close(); System.out.println("Thanks for playing!"); } }
这两种方法都能解决你的问题,选哪种看你习惯啦!
内容的提问来源于stack exchange,提问作者specter_93
相关产品推荐
相关产品推荐

