Java程序中字符串asd重复打印及输入逻辑问题求助
解决Java中while循环重复打印字符串的问题
嘿,我一眼就看出问题所在了!你遇到的"asd"字符串重复打印的情况,根源在于Scanner输入操作后的换行符残留。
问题原因详解
当你用sc.nextInt()获取用户输入的水果数量时,用户输入数字后按下回车键,这个回车键对应的换行符(\n)会留在输入缓冲区里。接下来进入switches()方法的while循环,第一次调用sc.nextLine()时,它会直接读取这个残留的空换行符,而不是等待用户输入新内容。这就导致switcher是空字符串,你的switch语句没有匹配的case分支,counter1也就不会递增——循环条件counter1 < catcher依然成立,于是"asd"就被第二次打印出来了。
解决方案
最简单的修复方式是在sc.nextInt()之后,额外调用一次sc.nextLine()来清空输入缓冲区里的换行符。修改你的catching()方法如下:
static void catching(){ System.out.println("Catch and eat any of these fruits: " + "'apple', 'orange', 'mango', 'guava'"); System.out.println("A apple, O orange, M mango, G guava"); System.out.print("How many fruits would you like to catch? "); catcher = sc.nextInt(); sc.nextLine(); // 新增这行,清空残留的换行符 switches(); }
这样调整后,当进入switches()的while循环时,第一次sc.nextLine()就会正常等待用户输入,"asd"自然只会打印一次。
额外优化建议
你的switch语句目前只处理了"a"的情况,建议补充其他水果的case分支,再加上default分支处理无效输入,这样程序逻辑会更健壮:
switch (switcher.toLowerCase()) { // 转小写,兼容用户输入大写的情况 case "a": basket.push("apple"); counter++; counter1++; break; case "o": basket.push("orange"); counter++; counter1++; break; case "m": basket.push("mango"); counter++; counter1++; break; case "g": basket.push("guava"); counter++; counter1++; break; default: System.out.println("无效输入哦,请输入A/O/M/G中的一个~"); // 不递增counter1,让用户重新输入当前序号的水果 break; }
内容的提问来源于stack exchange,提问作者cedieasd
相关产品推荐
相关产品推荐

