1
resposta

[Sugestão] Usar TWR - Try With Resources para evitar problemas com .close() do Scanner

No codigo passado pelo instrutor, sei que e para uso didado para iniciantes como eu, mas vi que ha um error ou, ao menos, parece um error. O erro em questao e o fechamento da Class Scanner na linha 16:

scanner.close();

Isso porque ele foi feito dentro de um bloco try e caso seja lancada uma exception pelo new File:

} catch (FileNotFoundException e) {
            System.out.println("Arquivo não encontrado!");
}

ele ira autimaticamente ignorar todo o resto do codigo, logo no inicio do bloco try-catch e pular para o catch, fazendo assim uma ma finalizacao do programa, que nao fechou corretamente o Scanner por ter sido ignorado. Uma abordagem para tratar isso, seria utilizando o campo finally desta forma:

finally {
            scanner.close()
}

assim, mesmo que o error ocorra no inicio do bloco e ele pule diretamente para o catch, logo apos o error se tratado, o bloco finally e executando fechando o Scanner. Contudo, isso deixa o codigo muito grande e verboso e com uma leitura um pouco ruim, e por isso, uma melhor abordagem seria usar uma versao melhorada do try-catch lancada no Java 7 chamada TWR - Try With Resources, onde voce passa o(os) dado(os) com que quer trabalhar em um parametro entre "(...)" e ele automaticamente ira fazer o fechamento dos dados no final apos tratar o catch caso ocorra ou nao, isso porque ele implementa da interface AutoCloseable. Espero nao estar falando besteira, mas bem, o codigo refatorando usando o TWR ficou assim:

Codigo Antigo | Instrutor

public class LeituraDeArquivo {
    public static void main(String[] args) {
        try {
            File arquivo = new File("arquivo.json");
            Scanner scanner = new Scanner(arquivo);

            while (scanner.hasNextLine()) {
                String linha = scanner.nextLine();
                System.out.println(linha);
            }

            scanner.close();
        } catch (FileNotFoundException e) {
            System.out.println("Arquivo não encontrado!");
        }
    }
}

Codigo Refatorado | Meu codigo

public class LeituraDeArquivo {
    public static void main(String[] args) {

        try (Scanner scanner = new Scanner(new File("arquivo.json"))) {

            while (scanner.hasNextLine()) {
                String linha = scanner.nextLine();
                System.out.println(linha);
            }

        } catch (FileNotFoundException e) {
            System.err.println("Arquivo não encontrado!");
        }
    }
}
1 resposta

Bom dia colega! valeu por compartilhar a sugestão