目录
一、引入问题
最近突然发现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);
}