Вот сокращенная версия кода, который выдает исключение.
static String s1;
static String s2;
static void getString(String s) {
Scanner sc = new Scanner(System.in);
s = sc.nextLine();
sc.close();
}
public static void main(String[] args) {
getString(s1);
getString(s2);
}
Исключение в потоке "main" java.util.NoSuchElementException: строка не найдена в java.util.Scanner.nextLine (Scanner.java:1540) в temp.Temp.getString (Temp.java: 13)
Я дважды вызываю метод getString
, и при втором вызове он прерывается на:
s = sc.nextLine();
Теперь я понимаю, что удаление sc.close()
строка решает проблему (и, вероятно, делает sc
статической переменной тоже).Что мне нужно понять, так это то, ПОЧЕМУ это так.
Я прочитал спецификацию класса scanner
, но не смог понять.Я также прочитал несколько сообщений об этом исключении, включая this , в котором говорится, что закрытие сканера также закрывает основной поток.Но я создаю новый сканер и заново открываю поток при каждом вызове метода, не так ли?