Scanner的使用注意事项
不知道大家在使用Scanner的时候有没有遇到这样的异常:java.util.NoSuchElementException
示例:
main方法:
public static void main(String[] args){
Scanner scanner1 = new Scanner(System.in);
String str1 = scanner1.nextLine();
System.out.println(str1);
scanner1.close();
Scanner scanner2 = new Scanner(System.in);
String str2 = scanner2.nextLine();
System.out.println(str1);
scanner2.close();
}
异常信息
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1540)
浅析原因:
我们在 new Scanner(System.in)
的时候传入了一个 InputStrem
也就是 System.in
其具体实现是 BufferedInputStream
再让我们看看 Scanner的close方法
这下就找到原因了:
我们在使用完第一个
Sanner
的时候,调用了它的close()
方法,导致将System.in
这个输入流给关闭了,我们在创建第二个Scanner
的时候虽然也传入了System.in
,但这是JVM提供给我们的同一个输入流,而且在之前已经被我们关闭了,所以当我们再调用nexLine()
方法使用这个输入流的时候,系统就会抛出异常。
虽然我们平时很少会用这这种逻辑,如果用到了,建议把Scanner.close()方法程序最后。