NoSuchElementException при повторном открытии сканера в методе - PullRequest
0 голосов
/ 06 декабря 2018

Вот сокращенная версия кода, который выдает исключение.

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 , в котором говорится, что закрытие сканера также закрывает основной поток.Но я создаю новый сканер и заново открываю поток при каждом вызове метода, не так ли?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Вы не можете "заново открыть" System.in, System.out или System.err, как объяснено здесь

В качестве другого решения для этого вы можете использовать CloseShieldInputStream, который объясняется здесь

0 голосов
/ 06 декабря 2018

Не существует такой вещи, как «открытие потока».Единственное, что вы можете сделать, это создать новый поток с новым Scanner и, необязательно, поместить его в ту же переменную.

Когда вы закроете sc, вы также закроете основной поток System.in,Создание нового Scanner поверх него не может «открыть» его, и, поскольку поток закрывается, вы получаете это исключение.

Короче говоря, - это определенно хорошая практиказакрыв ресурсы, когда вы закончите с ними, вы не должны закрывать System.in (или любой сканер на его основе).

...