Java while循环跳过首次用户输入问题求助
解决英雄名字输入跳过/无法识别空格的问题
嘿,这个问题我太熟了!本质是Scanner类的输入缓冲区残留换行符在搞鬼,我给你拆解清楚,再给你俩靠谱的解决方案:
问题根源
当你在调用nextLine()之前,如果用过nextInt()、next()这类方法,它们只会读取输入里的有效内容(比如数字、不含空格的字符串),但会把输入末尾的**换行符(\n)**留在输入缓冲区里。接下来调用nextLine()时,它会直接读取这个残留的换行符,相当于读了个空字符串,看起来就像是“跳过了英雄1的名字输入”。
而用next()的话,它默认把空格当成分隔符,带空格的名字会被拆成好几段,自然没法读取完整的名字。
解决方案
这里给你两种简单有效的办法:
方法1:清理残留的换行符
在第一次调用nextLine()读取名字之前,先额外调用一次nextLine()吃掉缓冲区里的换行符。修改你的heroNames()方法示例:
public void heroNames() { Scanner scanner = new Scanner(System.in); int count = 2; // 假设设置2个英雄 String[] heroNames = new String[count]; // 先清理之前可能残留的换行符(比如如果之前用了nextInt()获取英雄数量) if (scanner.hasNextLine()) { scanner.nextLine(); } for (int i = 0; i < count; i++) { System.out.println("请输入英雄" + (i+1) + "的名字:"); heroNames[i] = scanner.nextLine(); // 用nextLine()读取完整带空格的名字 } // 测试输出验证 for (String name : heroNames) { System.out.println("英雄名字:" + name); } scanner.close(); }
方法2:用BufferedReader替代Scanner
如果觉得Scanner的这种特性太麻烦,也可以换用BufferedReader来读取输入,它不会有这类换行符残留的问题,读取带空格的名字也顺畅:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public void heroNames() { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); int count = 2; String[] heroNames = new String[count]; try { for (int i = 0; i < count; i++) { System.out.println("请输入英雄" + (i+1) + "的名字:"); heroNames[i] = reader.readLine(); } // 测试输出验证 for (String name : heroNames) { System.out.println("英雄名字:" + name); } } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } }
小提示
如果你的代码里是先通过nextInt()让用户输入英雄数量,那一定要在nextInt()之后立刻调用scanner.nextLine()清理换行符,再去读取名字,这样就不会出现跳过输入的情况啦!
内容的提问来源于stack exchange,提问作者Flynn Lange
相关产品推荐
相关产品推荐

