Scanner 类抛出java.util.NoSuchElementException

来源:互联网 发布:东方财富大数据部门 编辑:程序博客网 时间:2024/06/05 18:08

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 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)

下面是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;    }

原因:Scanner(system.in)在Scanner中接受的是键盘 输入,当调用close()方法时,Scanner的关闭会导致System.in的关闭,System.in是标准输入(键盘输入),只能关一次,关闭后不能再打开。

综上所述,有如下建议:
1、Scanner对象只能有一个(可设为成员变量)
2、Scanner对象只能关闭一次(如果非得关闭的话)