автоматическое закрытие не работает со сканером

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)


person Akshay    schedule 14.08.2015    source источник


Ответы (1)


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

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

Я бы изменил код, чтобы повторно использовать сканер для обоих чтений.

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;
}
person Sam    schedule 14.08.2015
comment
Спасибо! Это поможет. - person Akshay; 15.08.2015