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!");
}
}
}