Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Java

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,
  1. declarando e instanciando o recurso dentro do try cláusula.
  2. 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:

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

  1. Operadores Java
  2. Comentários Java
  3. Java if... else Declaração
  4. Java para cada loop
  5. Strings Java
  6. Interface Java
  7. Classe anônima Java
  8. Anotações Java
  9. Asserções Java
  10. Vetor Java