Java的Scanner类close()方法: java.util.NoSuchElementException

在java中,Scanner是一个经常使用的类,但却有坑人的地方。
我们知道,Scanner对象在声明的时候会传入一个参数,如:Scanner input = new Scanner(System.in );
Java的Scanner类close()方法: java.util.NoSuchElementException_第1张图片
而这个参数是一个ImputStream对象,作为一个流,不关闭的话会消耗很大的资源,于是要使用close()方法将其关闭,但使用不当就会抛出一个异常:java.util.NoSuchElementException

看看代码:

Scanner input1 = new Scanner(System.in);
String str1 = input1.nextLine();
input1.close();
Scanner input2 = new Scanner(System.in);
String str2 = input2.nextLine();

运行一下:
在这里插入图片描述
解释:
创建Scanner对象时,括号里的参数是 System.in,而in是一个final类型,它一旦被初始化就不能改变。所以,不管你后面创建多少个Scanner对象,返回的都是同一个InputStream流,也就是说,每一次赋给新对象的地址是同一个。这就造成了一旦某个Scanner对象使用close()方法将其关闭,后面所有使用的流都是关闭的,所以上面的代码就会抛出异常:java.util.NoSuchElementException

解决:
在使用完全结束后才调用close()方法关闭流。

收获:
这种场景的使用不太会见到,但这种错误大多出现在方法调用的过程中,调用方法关闭流之后被调方法创建Scanne对象就会出错,所以尽量不要多次创建Scanner对象,而以参数传递的方式进行。

你可能感兴趣的:(Java)