nextLine() 问题
在连续两个输入并且第二个输入是 nextLine() 时,输入数据会产生错误。没有数据或者多了一个空格。
测试代码
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
String str1 = in.nextLine();
String str2 = in.nextLine();
System.out.println(a);
System.out.println(str1);
System.out.println(str2);
}
输入一
80 str1 str1
str2
输出一
80
str1 str1
str2
发现输出第一个str前边有空格,即在输入80之后,第一个nextLine() 接收了之后的空格,直到遇到换行符结束。
输入二
80
only str2
输出二
80
only str2
输入80后,直接换行,这时str1接收了这个换行,并且遇到换行结束,所以str1中只有一个换行符,再次输入会是 str2 的内容
解决办法
next()、nextInt()......接收输入以空格为分隔,不能接收换行符
只有nextLine() 可以接收换行符,并且以换行符为分隔
输入时使用两个连续的 nextLine() ,第一个nextLine() 用于接收换行或者其他的无效输入,第二个nextLine() 接收有效输入
close()问题
在一个程序中,一个scanner对象 close() 之后,使用其他scanner对象输入时,会抛出 NoSuchElementException 异常。
代码一
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
System.out.println("a = " + a);
Demo2 d2 = new Demo2();
d2.scannerTest();
int c = in.nextInt();
System.out.println("c = " + c);
in.close();
}
}
class Demo2 {
public void scannerTest() {
Scanner in1 = new Scanner(System.in);
int b = in1.nextInt();
System.out.println("b = " + b);
in1.close();
}
}
输出
1
a = 1
2
b = 2
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at test.Demo1.main(Demo1.java:16)
代码二
// 代码一 中的片段
Demo2 d2 = new Demo2();
d2.scannerTest();
// 在 d2 中关闭 in1 后,创建 in2 对象,试图重新打开 System.in 流
Scanner in2 = new Scanner(System.in);
// 这一行还是会报错,证明 System.in 流一旦被关闭,就无法再次被打开
int c = in2.nextInt();
System.out.println("c = " + c);
in2.close();
结论
当 in1 调用 close() 后,System.in流将会关闭,而这种关闭将是永久性的,导致之后将不能接受任何数据,从而引发NoSuchElementException的错误,而代码二也证明 System.in 流一旦被关闭,就无法再次被打开
解决办法
- 把Scanner对象设为成员变量
- Scanner对象只能关闭一次,在程序不再有输入需求后关闭流。
网友评论