You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:29:15