2022.3.9使用Scanner类控制台输入时出现直接跳过输入过程问题
1 Scanner scanner = new Scanner(System.in); 2 System.out.println("输入第一个数"); 3 double a = scanner.nextDouble(); 4 System.out.println("输入+,-,*,/"); 5 String s = scanner.nextLine(); 6 System.out.println("输入第二个数"); 7 double b = scanner.nextDouble();

会直接跳过第二个输入
1 Scanner scanner = new Scanner(System.in); 2 System.out.println("输入+,-,*,/"); 3 String s = scanner.nextLine(); 4 System.out.println("输入第一个数"); 5 double a = scanner.nextDouble(); 6 System.out.println("输入第二个数"); 7 double b = scanner.nextDouble();
调换顺序后正常输入

是由于Scanner 类对象中的 nextInt() 和 nextLine() 方法内部读取原理不同导致的。 对于nextLine()方法,在该例子中,当i调用nextLine()方法时,读取的是字符串形式,输入的内容就相当于在一个管道中。 在未输入的时候,类似于阻塞状态,当输入内容之后,输入回车,然后nextLine()方法就开始读取内容,nextLine的读取方式是将enter回车符号(\r\n)和输入内容一同读取出来,在赋值的时候它再将enter回车符除去。

对于nextDouble()方法,在该例子中,当调用nextDouble()方法时,读取的是Double型,输入的内容就相当于在一个管道中。 在未输入的时候,类似于阻塞状态,当输入内容之后,输入回车,然后nextDouble()方法就开始读取内容,nextDouble的读取方式是将enter回车符号(\r\n)之前的输入内容读取出来,Enter回车符留在里里面。类似的还有nextLong(),nextInt()等

看到这,便可以解释这个神奇的事情了。 当先输入数字时调用的是nextDouble()方法,读取完后剩下一个Enter回车符,不巧的是接下来输入姓名的时候,调用的是nextLine()方法,这时刚好有一个Enter回车符,它便以为输入完了就直接将Enter前面的空串读取进去了,所以我们看着的效果就像是直接跳过了输入符号过程。
有三个解决方法:
-
在调用nextDouble()方法之后,nextLine()方法之前,加上一个语句 scanner.nextLine(); 将nextDouble()读取后剩下的Enter回车符先读取掉。
1 Scanner scanner = new Scanner(System.in); 2 System.out.println("输入第一个数"); 3 double a = scanner.nextDouble(); 4 scanner.nextLine();//将回车符提取出来 5 System.out.println("输入+,-,*,/"); 6 String s = scanner.nextLine(); 7 System.out.println("输入第二个数"); 8 double b = scanner.nextDouble();
-
使用 next() 方法之前代替 nexLine() 方法。
1 Scanner scanner = new Scanner(System.in); 2 System.out.println("输入第一个数"); 3 double a = scanner.nextDouble(); 4 System.out.println("输入+,-,*,/"); 5 String s = scanner.next();//使用next()方法之前代替nexLine()方法 6 System.out.println("输入第二个数"); 7 double b = scanner.nextDouble();
-
都使用nextLine()方法,赋值的时候再进行类型转换。
1 Scanner scanner = new Scanner(System.in); 2 System.out.println("输入第一个数"); 3 int a = Integer.parseInt(scanner.nextLine()); 4 System.out.println("输入+,-,*,/"); 5 String s = scanner.nextLine();

浙公网安备 33010602011771号