2016-06-01 3 views
-1

Может ли этот код ниже правильно работать без создания нового объекта Scanner внутри цикла?Java: Ручка Вход сканера внутри петли только с одним объектом сканера

Можете ли это сделать только с определением объекта сканера за пределами цикла (прокомментированный код)?

// Scanner sc = new Scanner(System.in); 
while(true){ 
    Scanner sc = new Scanner(System.in); 
    try{ 
    int x = sc.nextInt(); 
    System.out.printf("You gave %d\n", x); 
    }catch(Exception e){ 
    System.out.println("Plz give a valid number!"); 
    }finally{ 
    sc.close(); 
    } 
} 
+0

Вы хотите, как только вы получите Действительный номер, а затем больше не спрашиваете? я имею в виду, что когда-то действительное значение получает, а затем хочет освободиться от цикла while? –

+0

О закрытии сканера: [java.util.NoSuchElementException - считывание пользователем сканера] (http://stackoverflow.com/q/13042008) – Tom

+0

@vishalgajera Нет, я просто хочу дать номер, затем скажите мне номер и когда цикл начинает давать новый вход снова! – Skemelio

ответ

1

При определении Scanner вне цикла, вы используете один и тот же сканер на каждом прогоне цикла. Если следующий токен не является допустимым целым числом, sc.nextInt() завершится с ошибкой и сканер не продвинется дальше этого токена. На следующей итерации sc.nextInt() увидит тот же недействительный токен и снова сработает. Аналогично, если вы закроете сканер, следующая итерация цикла вызовет sc.nextInt() на закрытом сканере, что не удастся. Последовательные итерации будут сбой по той же причине.

С другой стороны, когда сканер определен в цикле, каждая итерация использует новый сканер. Даже если sc.nextInt() не работает, следующая итерация будет использовать свежий сканер, который не содержит один и тот же недопустимый токен.

+0

Итак, единственное решение - создать новый сканер все время? И закрыть его, конечно? Но разве это не требует много ресурсов, процессора и т. Д.? :( – Skemelio

+0

@Skemelio Нет, есть другие способы решить эту проблему, просто прочитайте дублированный вопрос (см. Ссылку выше вашего вопроса). – Tom

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