Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在循环中使用扫描仪时引发异常?_Java_Java.util.scanner - Fatal编程技术网

Java 在循环中使用扫描仪时引发异常?

Java 在循环中使用扫描仪时引发异常?,java,java.util.scanner,Java,Java.util.scanner,我正在用Java将整数读入一个列表,我发现在将Scanner&nextInt()放入循环时引发了一个异常 在此代码中,在扫描程序类上引发异常: do{ System.out.println("?"); Scanner in = new Scanner(System.in); input = in.nextInt(); in.close(); if(input != SENTINEL) numberL

我正在用Java将整数读入一个列表,我发现在将Scanner&nextInt()放入循环时引发了一个异常

在此代码中,在扫描程序类上引发异常:

do{

        System.out.println("?");
        Scanner in = new Scanner(System.in);
        input = in.nextInt();
        in.close();
        if(input != SENTINEL)
        numberList.add(input);

    }while(input != SENTINEL);
然而,移动扫描仪初始化并在循环外部关闭工作正常:

Scanner in = new Scanner(System.in);
    //receive input integers from user
    do{

        System.out.println("?");
        input = in.nextInt();
        if(input != SENTINEL)
        numberList.add(input);

    }while(input != SENTINEL);
    in.close();
为什么在循环中初始化Scanner类时会发生异常?谢谢

例外情况是:

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at main.Run.main(Run.java:25)

第一个版本崩溃的原因是调用-也会关闭底层流:

这可以通过包装
系统来证明。在
中,使用一个在
close()
方法中不做任何事情的类(unclosabledcorator的代码取自):

公共类游戏{
公共静态void main(字符串[]arg)引发IOException{
int-SENTINEL=10;
int输入=0;
List numberList=new ArrayList();
System.setIn(新的不可关闭装饰器(System.in));
做{
扫描仪输入=新扫描仪(系统输入);
System.out.println(“?”);
input=in.nextInt();
System.out.println(“[”+输入+“]);
in.close();
如果(输入!=哨兵){
numberList.add(输入);
}
}while(输入!=SENTINEL);
系统输出打印项次(“完成”);
}
}
类UnClosableDecorator扩展InputStream{
私有最终输入流InputStream;
公共不可关闭装饰器(InputStream InputStream){
this.inputStream=inputStream;
}
@凌驾
public int read()引发IOException{
返回inputStream.read();
}
@凌驾
公共整数读取(字节[]b)引发IOException{
返回inputStream.read(b);
}
@凌驾
公共整数读取(字节[]b,整数关闭,整数长度)引发IOException{
返回inputStream.read(b,off,len);
}
@凌驾
公共长跳过(长n)引发IOException{
返回inputStream.skip(n);
}
@凌驾
public int available()引发IOException{
返回inputStream.available();
}
@凌驾
公共同步无效标记(int readlimit){
inputStream.mark(读取限制);
}
@凌驾
public synchronized void reset()引发IOException{
inputStream.reset();
}
@凌驾
公共布尔标记受支持(){
返回inputStream.markSupported();
}
@凌驾
public void close()引发IOException{
//无所事事
}
}

什么是异常?在完成扫描器之前不要关闭扫描器。只需将异常添加到上面的描述中。close()中的
是什么?文档对此有何评论?我不知道人们为什么一直投反对票-这实际上是一个很好的问题,涉及到底层流
系统的实现细节。在
。非常有趣!谢谢你的解释,现在它更有意义了。
public class Play {

    public static void main(String[] arg) throws IOException {

        int SENTINEL = 10;
        int input = 0;
        List<Integer> numberList = new ArrayList<>();

        System.setIn(new UnClosableDecorator(System.in));

        do {
            Scanner in = new Scanner(System.in);
            System.out.println("?");
            input = in.nextInt();
            System.out.println("[" + input + "]");
            in.close();
            if(input != SENTINEL) {
                numberList.add(input);
            }

        } while(input != SENTINEL);
        System.out.println("done");
    }
}


class UnClosableDecorator extends InputStream {

    private final InputStream inputStream;

    public UnClosableDecorator(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    @Override
    public int read() throws IOException {
        return inputStream.read();
    }

    @Override
    public int read(byte[] b) throws IOException {
        return inputStream.read(b);
    }

    @Override
    public int read(byte[] b, int off, int len) throws IOException {
        return inputStream.read(b, off, len);
    }

    @Override
    public long skip(long n) throws IOException {
        return inputStream.skip(n);
    }

    @Override
    public int available() throws IOException {
        return inputStream.available();
    }

    @Override
    public synchronized void mark(int readlimit) {
        inputStream.mark(readlimit);
    }

    @Override
    public synchronized void reset() throws IOException {
        inputStream.reset();
    }

    @Override
    public boolean markSupported() {
        return inputStream.markSupported();
    }

    @Override
    public void close() throws IOException {
        //do nothing
    }
}