起因:在函数中新建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();