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

Java使用Scanner输入时String变量第二次赋值后为空是什么原因?

问题原因分析
  • 核心是Java的Scanner类不同输入读取方法的换行符处理逻辑存在差异:
    • nextBoolean()、next()这类方法只会读取对应类型的有效内容,不会消费输入末尾的换行符
    • 残留的换行符会停留在输入缓冲区,下一次执行nextLine()的时候,会直接读取到这个空的换行内容,所以你拿到的用户名字符串就变成空的
  • 原代码else分支里额外加的bob.next()属于多余逻辑,反而会多吞一次输入,进一步加剧输入错位的问题
修复方案

在每次调用nextBoolean()之后加一行bob.nextLine()手动消费掉残留的换行符,同时删掉else分支里没用的bob.next()即可。
修复后的完整代码如下:

import java.util.*;

public class JavaInputProject 
{
    public static void main(String args[])
    {
        int i=0;
        boolean boo = false;
        String user="User";
        String un = user + "> ";
        Scanner bob = new Scanner(System.in);

        System.out.print("Bob> 嘿用户,我叫BOB....你叫什么名字?\n"+un);

        do
        {
            user = bob.nextLine();
            System.out.println("Bob> 你确定要用这个用户名吗? \""+ user +"\"(请输入true/false)");
            System.out.print(un);
             
            boolean confirm = bob.nextBoolean();
            // 手动消费残留的换行符
            bob.nextLine();
            if(confirm)
            {
                boo = true;
                un = user + "> ";
            }
            else
            {
                if(i>=3)
                {
                    System.out.println("Bob> 我知道选个名字有点难,你能快点吗?");
                }
                System.out.print("Bob> 请输入新的用户名\n"+un);
                i++;
            }
        } while(!boo);
     }
}

额外优化提示

  • 原代码中定义了likeab、age、Old、aAge四个未使用的变量,可直接删除避免编译警告
  • 原类名JavaInputProdject存在拼写错误,建议修正为JavaInputProject

内容的提问来源于stack exchange,提问作者Trinity Dionne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:15:03