本文共 2360 字,大约阅读时间需要 7 分钟。
目录
最近突然发现Scanner类的next()、nextInt()、nextDouble()等方法与nextLine()方法联用时,会出现无法通过nextLine()获得数据的现象。下面给一个例子。
import java.util.Scanner;public class ScannerTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Please enter an int number: "); int intNum = sc.nextInt(); System.out.println("Please enter an line of strings: "); String str = sc.nextLine(); sc.close(); System.out.println("intNum:"+intNum); System.out.println("str: "+str); }}
运行结果为如下所示,nextLine()方法被“跳过”了。事实上,把nextInt()换成next()、nextDouble()等方法结果也是这样。
我们试着改变两者的输入顺序
import java.util.Scanner;public class ScannerTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Please enter an line of strings: "); String str = sc.nextLine(); System.out.println("Please enter an int number: "); int intNum = sc.nextInt(); sc.close(); System.out.println("intNum:"+intNum); System.out.println("str: "+str); }}
发现这回的结果却是正常的。
查看一下用户文档上两个方法用法上的区别:
nextInt()Scans the next token of the input as an int.nextLine()Advances this scanner past the current line and returns the input that was skipped.
next()、nextInt()、nextDouble()等方法会以空白(空格、\n)为分隔符,截取两个空白之间的字符串作为token,并将其返回。而nextLine()方法则是扫描光标到当前行行尾的所有字符,并将它们作为一个整体返回。也就是说,nextLine()方法会从当前光标处的字符一直扫描,直到出现换行符\n(即,行尾)。
这么一来,上面的问题原因就出来了:由于我们输入第一个整数时,敲了一下回车键(\n),所以导致nextLine()方法因为提前遇到换行符\n而结束。
还是上面第一个程序,我们在运行一下。
发现这时,nextLine()方法就将光标处的第一个空格以及后面的Jones Snow都扫描到了。所以说,上面的猜想是正确的。
这里有两个小方案来解决上面的问题。
(1)多加一个nextLine()方法,将输入整数时多出的一个回车键(\n)消费掉
public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Please enter an int number: "); int intNum = sc.nextInt(); System.out.println("Please enter an line of strings: "); sc.nextLine(); String str = sc.nextLine(); sc.close(); System.out.println("intNum:"+intNum); System.out.println("str: "+str); }
(2)用两个扫描器,一个输入整数,一个输入一行字符串,这样就互不影响了
public static void main(String[] args) { Scanner sc = new Scanner(System.in); Scanner sc2 = new Scanner(System.in); System.out.println("Please enter an int number: "); int intNum = sc.nextInt(); System.out.println("Please enter an line of strings: "); String str = sc2.nextLine(); sc.close(); sc2.close(); System.out.println("intNum:"+intNum); System.out.println("str: "+str); }
转载地址:http://hbnii.baihongyu.com/