Автоматическое закрытие не работает со сканером
package org.test; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegTest { public static void main(String[] args) throws InterruptedException { String str = readLine("Enter String :"); String patternString = readLine("Enter pattern to search :"); Pattern pattern = Pattern.compile(patternString); Matcher matcher = pattern.matcher(str); System.out.print("match positions: "); // matches positions while(matcher.find()) { System.out.print(matcher.start() + " "); } System.out.println(""); } static String readLine(String message){ String strLine; try (Scanner in = new Scanner(System.in)) { System.out.println(message); strLine= in.nextLine(); } return strLine; } }
Не работал.
Выход:
Введите строку:
wewew
Введите шаблон для поиска:
Исключение в потоке "main" java.util.NoSuchElementException: строка не найдена
на java.util.Scanner.nextLine(Scanner.java:1585)
на org.test.RegTest.readLine(RegTest.java:39)
на org.test.RegTest.main(RegTest.java:22)
1 ответ
Решение
Когда try-with-resources (autoclosable) закрывает сканер, он также закрывает входной поток, делая его недоступным для использования в будущем.
Поскольку System.in является глобальным входным потоком, это означает, что второй сканер не может прочитать что-либо из входного потока, потому что он был закрыт и выдает исключение.
Я бы изменил код, чтобы повторно использовать sanner для обоих чтений.
public static void main(String[] args) throws InterruptedException {
try (Scanner in = new Scanner(System.in)) {
String str = readLine(in, "Enter String :");
String patternString = readLine(in, "Enter pattern to search :");
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(str);
System.out.print("match positions: "); // matches positions
while (matcher.find()) {
System.out.print(matcher.start() + " ");
}
System.out.println("");
}
}
static String readLine(Scanner in, String message) {
String strLine;
System.out.println(message);
strLine = in.nextLine();
return strLine;
}