1-解决java Scanner出现 java.util.NoSuchElementException

起因:在函数中新建scanner对象,然后多次调用此方法出现上述异常

原因:Scanner(system.in)在Scanner中接受的是键盘 输入,当调用close()方法时

Scanner的关闭会导致System.in的关闭,System.in是标准输入(键盘输入),只能关一次,关闭后不能再打开。

解决办法1:在主函数的声明,然后作为参数传入方法中

解决办法2:

  查看scanner源码

// Boolean indicating if this scanner has been closed
    private boolean closed = false;

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;
    }

   直接在函数中用反射改变closed的值,实现永远不关闭

 public void scanner() throws NoSuchFieldException, IllegalAccessException, InstantiationException {
        Scanner my=new Scanner(System.in);

        a=my.nextInt();
        b=my.nextInt();
        c=my.nextInt();
        Class clazz  =Scanner.class;
        Field field = clazz.getDeclaredField("closed");
        field.setAccessible(true);
        field.set(my,true);
        my.close();
    }

  当想要关闭的时候,再使用反射改变为false,调用scanner.close();

猜你喜欢

转载自www.cnblogs.com/simon-idea/p/9819801.html