Почему 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?


Ответы (0 шт):