Как закрыть объект сканера, когда он вызывается вне класса? - PullRequest
0 голосов
/ 05 ноября 2018

Допустим, у меня есть пользовательский объект чтения, который выдает исключение:

public StationReader {

    public StationReader(String inFile) throws FileNotFoundException {
        Scanner scan = new Scanner(inFile);

        while (scan.hasNextLine() {
            // blah blah blah
        }

        // Finish scanning
        scan.close();       
    }
}

И я вызываю StationReader из другого класса, тестер:

public Tester {

    public static void main(String[] args) {

        try {
            StationReader sReader = new StationReader("i_hate_csv.csv");

        } catch (FileNotFoundException e) {
            System.out.println("File not found arggghhhhhh");
        } finally {
            // HOW TO CLOSE SCANNER HERE??
        }
    }
}

Теперь давайте представим, что при сканировании через строки выдается исключение, поэтому scan.close() никогда не вызывается.

Как тогда закрыть объект сканера в этом случае?

1 Ответ

0 голосов
/ 05 ноября 2018

Запишите процесс чтения в try-with-resources операторе , но не перехватывайте ни одно из исключений, просто дайте их передать вызывающей стороне, например ...

public class CustomReader {

    public CustomReader(String inFile) throws FileNotFoundException {
        try (Scanner scan = new Scanner(inFile)) {
            while (scan.hasNextLine()) {
                // blah blah blah
            }
        }
    }
}

Оператор try-with-resource автоматически закроет ресурс, когда существует код, блок try

fyi: finally используется для этого, но когда у вас есть несколько ресурсов, это становится грязным. Всем привет try-with-resources ?

...