English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico de Java

Controle de fluxo do Java

Java Array

Java Orientação a Objetos (I)

Java Orientação a Objetos (II)

Java Orientação a Objetos (III)

Tratamento de Exceção Java

Java Lista (List)

Java Queue (fila)

conjunto Map do Java

conjunto Set do Java

Java Entrada e Saída (I/)

Reader do Java/Writer

Outros tópicos do Java

Java try-with-resources

Neste tutorial, vamos aprender try-with-O bloco resources fecha recursos automaticamente.

try-with-O bloco resources fecha automaticamente todos os recursos no final da sentença. Recursos são objetos que precisam ser fechados no final do programa.

Sua sintaxe é:

try (declaração de recurso) {
  // uso do recurso
} catch (ExceptionType e1) {
  // bloco catch
}

Da sintaxe acima, podemos ver que declaramos try-with-bloco resources

  1. Declarar e instanciar recursos no bloco try.

  2. Especificar e lidar com todas as exceções que podem ser levantadas ao fechar recursos.

Atenção:try-with-A declaração de bloco resources fecha todos os recursos que implementam a interface AutoCloseable.

Vamos implementar try-with-Exemplo de declaração de bloco resources.

示例1: try-with-resources

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());
    }
  }
}

Se o arquivo test.txt não for encontrado, será exibido.

IOException no bloco try-with-bloco resources => test.txt (Não há tal arquivo ou diretório)

Se o arquivo test.txt for encontrado, será exibido.

Entrando no bloco try-with-bloco resources
Linha => linha test

Neste exemplo, a instância BufferedReader usada lê dados do arquivo test.txt.

No bloco try-with-A declaração e instância de BufferedReader no bloco resources garante que sua instância seja fechada, independentemente de o bloco try ser concluído normalmente ou gerar uma exceção.

Se ocorrer uma exceção, podemos usar o bloco de tratamento de exceções ou}}Palavra-chave throwspara tratá-las.

Exceções suprimidas

No exemplo acima, podemos recuperar exceções a partir do bloco try-with-A exceção lançada pela declaração de recursos é:

  • Arquivo test.txt não encontrado.

  • Fechar o objeto BufferedReader.

Também podemos lançar exceções a partir do bloco try, porque a leitura do arquivo pode falhar a qualquer momento por várias razões.

Se surgirem exceções a partir do bloco try e do bloco try-with-Se todas as declarações de recursos lançarem exceções, lançará a exceção do bloco try e suprimirá a exceção do bloco try-with-exceções na declaração de recursos.

Recuperar exceções suprimidas

No Java 7E nas versões mais altas, podemos chamar o método Throwable.getSuppressed() das exceções lançadas no bloco try para recuperar as exceções suprimidas.

Este método retorna o array de todas as exceções suprimidas. Obtemos as exceções suprimidas no bloco catch.

catch (IOException e) {
  System.out.println("Exceção lançada=>" + e.getMessage());
  Throwable[] suppressedExceptions = e.getSuppressed();
  for (int i = 0; i < suppressedExceptions.length;++) {
    System.out.println("Exceção suprimida=>" + suppressedExceptions[i]);
  }
}

Usar try-with-Vantagens dos recursos

Isso é usar try-with-Vantagens dos recursos:

1O bloco finally não precisa fechar recursos

No Java 7Antes de introduzir essa função,我们必须使用 o bloco finally para garantir que os recursos sejam fechados para evitar vazamento de recursos.

Isso é semelhante a示例1do programaMas, neste programa, usamos o bloco finally para fechar recursos.

示例2Usar bloco finally para fechar recursos

import java.io;*;
class Main {
  public static void main(String[] args) {
    BufferedReader br = null;
    String line;
    try {
      System.out.println("Entrar no bloco try");
      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("进入 finally 块");
      try {
        if (br != null) {
          br.close();
        }
      } catch (IOException e) {
        System.out.println("IOException in finally block =>"+e.getMessage());
      }
    }
  }
}

输出结果

进入try 块
Line =>line do arquivo test.txt
进入 finally 块

从上面的示例可以看出,使用finally块来清理资源使代码更加复杂。

您注意到finally块中的try ... catch块吗? 这是因为在关闭此finally块内的BufferedReader实例时也可能发生IOException,因此也将其捕获并处理。

try-with-resources语句执行自动资源管理。我们不需要显式关闭资源,因为JVM会自动关闭它们。这使代码更具可读性,更易于编写。

2.try-with-resources 多个资源

我们可以try-with-resources使用分号将多个资源分开,从而在语句中声明多个资源;

示例3:尝试使用多种资源

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 o programa for executado sem gerar qualquer exceção, o objeto Scanner lê uma linha do arquivo testRead.txt e a escreve no novo arquivo testWrite.txt.

ao fazer várias declarações, o try-with-A instrução resources fecha esses recursos na ordem inversa. Neste exemplo, primeiro fecha o objeto PrintWriter, então fecha o objeto Scanner.

Java 9 try-with-Melhoria resources

No Java 7No-with-A instrução resources tem uma restrição. O recurso precisa ser declarado localmente dentro do bloco.

try (Scanner scanner = new Scanner(new File("testRead.txt"))) {
  // code
}

Se usarmos Java 7Se declararmos recursos no bloco externo, será lançada uma mensagem de erro.

Scanner scanner = new Scanner(new File("testRead.txt"));
try (scanner) {
  // code
}

Para resolver este erro, Java 9 Melhorou o try-with-A instrução resources, para que mesmo que a referência de recursos não seja declarada localmente, possa ser usada. O código atual agora será executado, não lançará nenhum erro de compilação.