运行Java成绩计算程序时控制台重复输出"Nome: "两次的问题
嘿,我太懂这个问题了!这是Java里Scanner类的经典小坑——输入缓冲区残留的换行符在搞鬼,我给你掰扯清楚:
问题根源
你用input.nextInt()读取学生数量的时候,它只会读取你输入的整数数字,而你按下回车键产生的**换行符(\n)**会留在输入缓冲区里没被处理。接下来当你用input.nextLine()去读取学生姓名时,它会直接把这个残留的换行符当成一个空的输入行读走,导致你感觉“跳过了一条输入指令”,然后循环继续执行,又打印了一次"Nome: ",看起来就像是重复打印了两次。
解决办法
给你两种简单的修复方案,选哪种都可以:
方案一:读完整数后手动清空缓冲区
在调用input.nextInt()之后,加一行input.nextLine(),把残留的换行符“吃掉”,这样后续读取姓名的时候就不会读到空内容了。修改后的代码片段:System.out.println("Informe a quantidade de alunos da sala de aula: "); quantidadeAlunos = input.nextInt(); input.nextLine(); // 关键:清空缓冲区里的换行符 qtdAlunos = new int[quantidadeAlunos]; nomeAlunos = new String[quantidadeAlunos]; // 假设你后续的循环是这样的 for(x = 0; x < quantidadeAlunos; x++){ System.out.print("Nome: "); nomeAlunos[x] = input.nextLine(); }方案二:统一用nextLine()读取所有输入
避免混合使用不同的Scanner读取方法,先读取整行输入,再把字符串转换成整数。这样从根本上避免了缓冲区残留问题,代码示例:System.out.println("Informe a quantidade de alunos da sala de aula: "); // 先读取整行,再转成整数 String numAlunosStr = input.nextLine(); quantidadeAlunos = Integer.parseInt(numAlunosStr); qtdAlunos = new int[quantidadeAlunos]; nomeAlunos = new String[quantidadeAlunos];
小提示
以后用Scanner的时候要注意:nextInt()、nextFloat()这类方法只读取对应的数据类型,不会处理末尾的换行符;而nextLine()会读取从当前位置到换行符的所有内容(包括空内容)。混合使用这两类方法时,就很容易踩这个缓冲区的坑,要么记得手动清空,要么统一用nextLine()再做类型转换就好啦!
内容的提问来源于stack exchange,提问作者Rodolfo Silva
相关产品推荐
相关产品推荐

