2015-08-29 3 views
-2

Я работаю над чтением целых чисел в список на Java, и я нашел исключение, которое бросается при установке в цикл цикла Scanner nextInt().Исключение броска при использовании сканера в цикле?

Исключение брошено на классе Scanner в этом коде:

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) 
+0

Что такое исключение? – Tunaki

+3

не закрывайте сканер до тех пор, пока вы не закончите с ним – Reimeus

+0

Просто добавлено исключение из приведенного выше описания –

ответ

0

Причина, по которой первая версия выходит из строя, что звонок в Scanner.close - также закрывает основной поток: System.in.

Это может быть доказано, обернув System.in с классом, который не делает ничего в close() методе (код для UnClosableDecorator был взят из here):

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 
    } 
} 
+1

Очень интересно! Спасибо за объяснение, теперь это имеет гораздо больше смысла. –

Смежные вопросы