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
相关产品推荐
相关产品推荐

