Java中Scanner的nextLine()在输入double类型后无法正常工作的问题
嘿,这个问题我之前也碰到过!是Scanner的输入读取机制在搞鬼,咱们一步步来解决:
首先先贴出你的代码:
import java.util.Scanner; public class test2 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println(""); int i = scan.nextInt(); double d=scan.nextDouble(); String s=scan.nextLine(); System.out.println("String: " + s); System.out.println("Double: " + d); System.out.println("Int: " + i); } }
你的预期与实际情况
你预期的输入是:
23
23
mks
预期输出应该是:
String: mks
Double:23.0
Int:23
但实际运行时,输入完第二个23并回车后,程序直接输出结果,根本没等你输入字符串,实际输出是:
String:
Double:23.0
Int:23
问题根源
问题出在nextInt()和nextDouble()的读取逻辑上:它们只会读取输入中的数值部分,完全不会处理数值后面的换行符。
举个例子,当你输入23并按回车时,输入流里实际是"23\n",nextDouble()读取了23,但剩下的"\n"还留在输入流里。接下来调用nextLine()时,它会从当前位置开始读取,直到遇到换行符——结果直接把这个空的换行符读成了空字符串,自然就跳过了你要输入的mks。
解决方案
这里给你三种可行的解决办法,按需选择:
方案1:吃掉残留的换行符(最常用)
在读取完double之后,额外调用一次scan.nextLine(),把输入流里残留的换行符消耗掉,这样后续的nextLine()就能正确读取用户输入的字符串了:
import java.util.Scanner; public class test2 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println(""); int i = scan.nextInt(); double d=scan.nextDouble(); // 新增:吃掉残留的换行符 scan.nextLine(); String s=scan.nextLine(); System.out.println("String: " + s); System.out.println("Double: " + d); System.out.println("Int: " + i); } }
方案2:用next()读取字符串(适合无空格的场景)
如果你的字符串不包含空格(比如示例中的mks),可以直接用scan.next()代替scan.nextLine()。因为next()会自动跳过前面的空白字符(包括换行符),直到遇到下一个空白字符为止,刚好能读取到目标字符串:
// 替换原有的String读取行 String s=scan.next();
⚠️ 注意:如果输入的字符串包含空格(比如hello world),next()只会读到hello,剩下的world会留在输入流里,这种情况就不适合用这个方案了。
方案3:统一用nextLine()读取再转换类型(最稳妥)
所有输入都用nextLine()读取,再手动把字符串转换成int和double类型,彻底避免换行符残留的问题:
import java.util.Scanner; public class test2 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println(""); // 读取int字符串并转换 int i = Integer.parseInt(scan.nextLine()); // 读取double字符串并转换 double d=Double.parseDouble(scan.nextLine()); String s=scan.nextLine(); System.out.println("String: " + s); System.out.println("Double: " + d); System.out.println("Int: " + i); } }
这种方法适合所有场景,不管输入有没有空格都能处理,不过要记得处理可能的类型转换异常(比如用户输入非数字的情况)。
内容的提问来源于stack exchange,提问作者Mohit Kumar Singh

