У меня есть две версии кода Java, которые получают пользовательский ввод до тех пор, пока пользователь не введет «q» версии 1:
public class Test {
public static void main(String[] args) {
String input = "";
while (!input.equals("q")) {
Scanner scanner = new Scanner(System.in);
System.out.print("Input: ");
input = scanner.nextLine();
System.out.println("Input was: " + input);
}
}
}
Версия 2:
public class Test {
public static void main(String[] args) {
String input = "";
while (!input.equals("q")) {
try(Scanner scanner = new Scanner(System.in)){
System.out.print("Input: ");
input = scanner.nextLine();
System.out.println("Input was: " + input);
}
}
}
}
Версия 1 работает так, как ожидалось, но версия 2 не работает должным образом. То есть после первого чтения пользовательского ввода выдает ошибку
Input: 12
Input was: 12Exception in thread "main"
Input: java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1540)
at RealEstateCompany.main(RealEstateCompany.java:115)
Я предполагаю, что поскольку версия 2 использует попытку с ресурсом, поэтому он закрывает сканер после использования, и это вызывает ошибку?
Спасибо за вашу помощь заранее!
[Обновление] Версия 3:
public class Test {
public static void main(String[] args) {
String input = "";
try(Scanner scanner = new Scanner(System.in)){
while (!input.equals("q")) {
System.out.print("Input: ");
input = scanner.nextLine();
System.out.println("Input was: " + input);
}
}
}
}
Версия 3 работает. Однако, почему версия 3 в порядке, а версия 2 не в порядке?
try-with
автоматически закрывает базовыйScanner
, который автоматически закрывает базовый поток, то естьSystem.in
. После этого вы больше не сможете получать какие-либо данные от пользователя. - person QBrute   schedule 01.12.2017while
, вы все еще находитесь внутри блокаtry
. Ресурс закрывается только тогда, когда вы покидаетеtry
, что и произошло во втором примере после одной итерации. - person QBrute   schedule 01.12.2017