Почему NoSuchElementException: No line found
Имеется класс действие, с помощью которого пользователю выводится запрос на ввод имени:
import java.util.Scanner;
public class EnterName {
private String name;
Scanner s;
public String EnterName(){
s = new Scanner(System.in);
while (true){
this.name = s.nextLine();
if(this.name.trim().length() == 0)
System.out.print("[ОШИБКА]:\n\t-Должен быть введен хотя бы один символ.\nПовторите ввод: ");
else {
s.close();
return this.name;
}
}
}
}
В данном классе создается поток ввода Scanner s = new Scanner(System.in) с именем s и в конце, если введен хотя бы один символ, то данный поток закрывается. И так каждый раз при вызове метода EnterName() происходит создание потока и его закрытие. Смотрим далее.
Далее имеется класс Bank и Client, которые наследуются от класса EnterName, чтобы использовать его метод EnterName() с целью избежания дублирования куска кода:
package com.company;
// БАНК
import java.util.ArrayList;
public class Bank extends EnterName{
private String name = ""; // название Банка
ArrayList<Client> clients = new ArrayList<>();
public void addClient(){
clients.add(new Client());
}
Bank(){
System.out.print("Введите название Банка: ");
this.name = EnterName();
}
}
package com.company;
// КЛИЕНТ
import java.util.ArrayList;
public class Client extends EnterName {
private String name = ""; // имя клиента
ArrayList<Account> accounts = new ArrayList<>();
Client(){
System.out.print("\nВведите имя клиента: ");
this.name = EnterName();
}
}
Далее в классе Main происходит создание объекта класса Bank и на консоли появляется предложение ввода названия банка. Вводим название - всё, ок. Далее выводится на консоли предложение ввода имени клиента и тут сразу вылазит исключение. Почему?
package com.company;
public class Main {
public static void main(String[] args) {
Bank b = new Bank();
for(int i = 0; i < 4; i++)
b.addClient();
}
}
Но если в методе EnterName() закомментировать закрытие потока s.close() - то всё ок. Почему так?
Мои рассуждения:
После ввода названия банка, происходит считывание до первого пробела, пользователь нажимает клавишу Enter, которая ещё делает такое действие, как добавление в поток ввода символа \n - символ перехода на новую строку, который и заносится уже в s.nextLine() при следующем вводе. Но тут вопрос - поток то создается заново? Где хранится тогда тот самый символ \n?