Java try-with-resources
Java try-with-resources
Neste tutorial, aprenderemos sobre a instrução try-with-resources para fechar recursos automaticamente.
O try-with-resources
A instrução fecha automaticamente todos os recursos no final da instrução. Um recurso é um objeto a ser fechado no final do programa.
Sua sintaxe é:
try (resource declaration) {
// use of the resource
} catch (ExceptionType e1) {
// catch block
}
Como visto na sintaxe acima, declaramos o
try-with-resources
declaração de, - declarando e instanciando o recurso dentro do
try
cláusula. - especificar e manipular todas as exceções que podem ser lançadas ao fechar o recurso.
Observação: A instrução try-with-resources fecha todos os recursos que implementam a interface AutoCloseable.
Vamos dar um exemplo que implementa o
try-with-resources
declaração. Exemplo 1:tente com recursos
import java.io.*;
class Main {
public static void main(String[] args) {
String line;
try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
while ((line = br.readLine()) != null) {
System.out.println("Line =>"+line);
}
} catch (IOException e) {
System.out.println("IOException in try block =>" + e.getMessage());
}
}
}
Saída se o arquivo test.txt não for encontrado.
IOException in try-with-resources block =>test.txt (No such file or directory)
Saída se o arquivo test.txt for encontrado.
Entering try-with-resources block Line =>test line
Neste exemplo, usamos uma instância de BufferedReader para ler dados do
test.txt
Arquivo. Declarando e instanciando o BufferedReader dentro do
try-with-resources
garante que sua instância seja fechada independentemente de o try
A instrução é concluída normalmente ou lança uma exceção. Se ocorrer uma exceção, ela pode ser tratada usando os blocos de tratamento de exceção ou a palavra-chave throws.
Exceções suprimidas
No exemplo acima, exceções podem ser lançadas do
try-with-resources
declaração quando:- O arquivo
test.txt
não foi encontrado. - Fechando o
BufferedReader
objeto.
Uma exceção também pode ser lançada do
try
block como uma leitura de arquivo pode falhar por vários motivos a qualquer momento. Se as exceções forem lançadas tanto do
try
bloco e o try-with-resources
instrução, exceção do try
bloco é lançado e exceção do try-with-resources
declaração é suprimida. Recuperando exceções suprimidas
No Java 7 e posterior, as exceções suprimidas podem ser recuperadas chamando o método
Throwable.getSuppressed()
método da exceção lançada pelo try
quadra. Esse método retorna uma matriz de todas as exceções suprimidas. Obtemos as exceções suprimidas no
catch
quadra.
catch(IOException e) {
System.out.println("Thrown exception=>" + e.getMessage());
Throwable[] suppressedExceptions = e.getSuppressed();
for (int i=0; i<suppressedExceptions.length; i++) {
System.out.println("Suppressed exception=>" + suppressedExceptions[i]);
}
}
Vantagens de usar try-with-resources
Aqui estão as vantagens de usar try-with-resources:
1. finalmente o bloco não é necessário para fechar o recurso
Antes do Java 7 introduzir esse recurso, precisávamos usar o
finally
block para garantir que o recurso seja fechado para evitar vazamentos de recursos. Este é um programa semelhante ao Exemplo 1 . No entanto, neste programa, usamos o bloco finally para fechar recursos.
Exemplo 2:Fechar recurso usando o bloco finally
import java.io.*;
class Main {
public static void main(String[] args) {
BufferedReader br = null;
String line;
try {
System.out.println("Entering try block");
br = new BufferedReader(new FileReader("test.txt"));
while ((line = br.readLine()) != null) {
System.out.println("Line =>"+line);
}
} catch (IOException e) {
System.out.println("IOException in try block =>" + e.getMessage());
} finally {
System.out.println("Entering finally block");
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
System.out.println("IOException in finally block =>"+e.getMessage());
}
}
}
}
Saída
Entering try block Line =>line from test.txt file Entering finally block
Como podemos ver no exemplo acima, o uso de
finally
block para limpar recursos torna o código mais complexo. Observe o
try...catch
bloco no finally
bloquear também? Isso ocorre porque um IOException
também pode ocorrer ao fechar o BufferedReader
instância dentro deste finally
bloco para que também seja capturado e manipulado. Os
try-with-resources
declaração faz gerenciamento automático de recursos . Não precisamos fechar explicitamente os recursos, pois a JVM os fecha automaticamente. Isso torna o código mais legível e mais fácil de escrever. 2. try-with-resources com vários recursos
Podemos declarar mais de um recurso no
try-with-resources
instrução separando-os com um ponto e vírgula ;
Exemplo 3:tente com vários recursos
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException{
try (Scanner scanner = new Scanner(new File("testRead.txt"));
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
while (scanner.hasNext()) {
writer.print(scanner.nextLine());
}
}
}
}
Se este programa for executado sem gerar nenhuma exceção,
Scanner
objeto lê uma linha do testRead.txt
arquivo e o grava em um novo testWrite.txt
Arquivo. Quando várias declarações são feitas, o
try-with-resources
A instrução fecha esses recursos na ordem inversa. Neste exemplo, o PrintWriter
objeto é fechado primeiro e depois o Scanner
objeto está fechado. Aprimoramento do Java 9 try-with-resources
No Java 7, há uma restrição ao
try-with-resources
declaração. O recurso precisa ser declarado localmente dentro de seu bloco.
try (Scanner scanner = new Scanner(new File("testRead.txt"))) {
// code
}
Se declararmos o recurso fora do bloco no Java 7, ele geraria uma mensagem de erro.
Scanner scanner = new Scanner(new File("testRead.txt"));
try (scanner) {
// code
}
Para lidar com esse erro, o Java 9 melhorou o
try-with-resources
declaração para que a referência do recurso possa ser usada mesmo que não seja declarada localmente. O código acima agora será executado sem nenhum erro de compilação. Java