Java 在循环中使用扫描仪时引发异常?
我正在用Java将整数读入一个列表,我发现在将Scanner&nextInt()放入循环时引发了一个异常 在此代码中,在扫描程序类上引发异常: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
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
}
}