English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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
Declarar e instanciar recursos no bloco try.
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.
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.
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.
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]); } }
Isso é usar try-with-Vantagens dos 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.
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会自动关闭它们。这使代码更具可读性,更易于编写。
我们可以try-with-resources使用分号将多个资源分开,从而在语句中声明多个资源;
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.
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.