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

 

转载于:https://www.cnblogs.com/simon-idea/p/9819801.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值