Scanner:
在API中是这样子解释的:一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。
Scanner是我们从键盘输入最常用的类。
Scanner分隔符模式将输入打破到令牌,默认情况下匹配空格。 然后可以使用各种next方法将得到的令牌转换成不同类型的值。
- nextInt()和nextLine()的区别:
看接下来一段代码:
public class Test1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
System.out.println(str);
int a = scanner.nextInt();
System.out.println(a);
}
}
运行结果:
hello java
hello java
666
666
Process finished with exit code 0
看起来很正常,没有什么要注意的,可是当我们将第4,5行放在第6,7行之后:
public class Test1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
System.out.println(a);
String str = scanner.nextLine();
System.out.println(str);
}
}
运行结果:
666
666
Process finished with exit code 0
其实并不是没有输入,而是系统在读取了int a = scanner.nextInt()之后,控制台就结束了,他并没有给我们继续输入的机会。
不仅仅是nextInt(),scanner.next() ; scanner.nextDouble() ; scanner.nextFloat() 等只要放在 scanner.nextLine() 之前,在我们第一次输入结束之后,控制台就会结束,不会给我们第二次输入的机会。
但是 scanner.nextLine();这句代码并不是没有运行,通过各种资料了解到,nextInt()只会读取数值,依旧还有一个回车“/r”没有读取,光标是放在本行中。所以,scanner.nextLine()读取的是回车“/r”并结束了。
Scanner是一个扫描器,我们录取到键盘的数据,先存到缓存区等待读取,它判断读取结束的标示是 空白符;比如空格,回车,tab 等等。
nextInt() ,scanner.next() , scanner.nextDouble() , scanner.nextFloat()等一系列结束的标志是读取到空白符;
而 scanner.nextLine() 结束的标志是读取到回车“/r”。
上文的第二种情况就是scanner.nextLine()读取到第一行的空白符,输入结束了,所以系统没有给我们输入的机会。
也就是nextInt()读取到空白符前的数据时结束了,然后把回车“\r”留给了nextLine();所以上面nextLine()没有输出,不输出不代表没数据,是接到了空(回车“/r”)的数据。
解决办法:
要想在nextInt()后读取一行需要再加上: scanner.nextLine()将nextInt()留下的“\r”读取掉。如下
public class Test1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
System.out.println(a);
scanner.nextLine();
String str = scanner.nextLine();
System.out.println(str);
}
}
运行结果:
666
666
hello java
hello java
Process finished with exit code 0