Scanner 类抛出java.util.NoSuchElementException
当我使用了Scanner之后将其关闭,下次调用会抛出java.util.NoSuchElementException
public class Test {
public static void main(String[] args) {
new Test().test();
new Test().test();
}
public void test() {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
System.out.println(n);
s.close();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
下面是异常:
1
1
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at com.nuc.zjy.demo01.Test.test(Test.java:27)
at com.nuc.zjy.demo01.Test.main(Test.java:22)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
下面是javaScanner 类的close()源码
public void close() {
if (closed)
return;
if (source instanceof Closeable) {
try {
((Closeable)source).close();//将会关闭流
} catch (IOException ioe) {
lastException = ioe;
}
}
sourceClosed = true;
source = null;
closed = true;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
原因:Scanner(system.in)在Scanner中接受的是键盘 输入,当调用close()方法时,Scanner的关闭会导致System.in的关闭,System.in是标准输入(键盘输入),只能关一次,关闭后不能再打开。
综上所述,有如下建议:
1、Scanner对象只能有一个(可设为成员变量)
2、Scanner对象只能关闭一次(如果非得关闭的话)