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

Tutoriales básicos de Java

Control de flujo Java

Java array

Java orientado a objetos (I)

Java orientado a objetos (II)

Java orientado a objetos (III)

Manejo de excepciones en Java

Java lista (List)

Java cola (Queue)

Java conjuntos Map

Java conjuntos Set

Java entrada/salida (I/)

Reader de Java/Writer

Otras temáticas de Java

Java try-with-Recursos

En este tutorial, aprenderemos sobre try-with-La declaración de recursos cierra recursos automáticamente.

try-with-La declaración de recursos cierra automáticamente todos los recursos al final de la sentencia. Los recursos son objetos que deben cerrarse al final del programa.

Su sintaxis es:

try (declaración de recursos) {
  // uso de los recursos
} catch (ExceptionType e1) {
  // Bloque catch
}

Desde la sintaxis anterior, podemos ver que declaramos try-with-Declaración de recursos en resources:

  1. Declarar e instanciar recursos en la cláusula try.

  2. Especificar y manejar todas las excepciones que pueden ocurrir al cerrar recursos.

Atención:try-with-La declaración de recursos en resources cierra todos los recursos que implementan el interfaz AutoCloseable.

Vamos a implementar try-with-Ejemplo de declaración de recursos en resources.

示例1: try-with-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 en el bloque try =>" + e.getMessage());
    }
  }
}

Si no se encuentra el archivo test.txt, se muestra.

Excepción IOException en try-with-Bloque de recursos => test.txt (No se encontró el archivo o directorio)

Si se encuentra el archivo test.txt, se muestra.

Entrando en try-with-Bloque de recursos
Linea => línea de test

En este ejemplo, la instancia de BufferedReader que utilizamos lee datos del archivo test.txt.

En try-with-La declaración e instanciación de BufferedReader en resources asegura que se cierre su instancia, ya sea que el bloque try se complete normalmente o se genere una excepción.

如果发生异常,则可以使用异常处理块或throws关键字对其进行处理。

抑制异常

在上面的示例中,在以下情况下可以从try-with-resources语句引发异常:

  • 找不到test.txt文件。

  • 关闭BufferedReader对象。

也可以从try块中引发异常,因为文件读取可能随时因多种原因而失败。

如果从try块和try-with-resources语句都抛出异常,则会抛出try块中的异常,并抑制try-with-resources语句中的异常。

检索抑制的异常

en Java 7和更高版本中,可以通过Throwable.getSuppressed()从try块引发的异常中调用方法来检索抑制的异常。

此方法返回所有抑制的异常的数组。我们在catch块中得到了抑制的异常。

catch(IOException e) {
  System.out.println("Excepción lanzada=>" + e.getMessage());
  Throwable[] suppressedExceptions = e.getSuppressed();
  for (int i = 0; i < suppressedExceptions.length; i++) {
    System.out.println("Excepción suprimida=>" + suppressedExceptions[i]);
  }
}

使用try-with-resources的优势

这是使用try-with-resources的优点:

1.finally块不需要关闭资源

en Java 7引入此功能之前,我们必须使用该finally块来确保关闭资源以避免资源泄漏。

这是一个类似于示例1的程序。但是,在此程序中,我们使用了finally块来关闭资源。

示例2:使用finally块关闭资源

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

输出结果

进入try 块
Line => línea desde el archivo 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());
      }
    }
  }
}

Si se ejecuta el programa sin generar ninguna excepción, el objeto Scanner lee una línea del archivo testRead.txt y la escribe en el archivo nuevo testWrite.txt.

se realizan múltiples declaraciones, try-with-resources sentencia cierra estos recursos en el orden inverso. En este ejemplo, primero se cierra el objeto PrintWriter, luego se cierra el objeto Scanner.

Java 9 try-with-Mejora de resources

en Java 7en, el try-with-resources sentencia tiene una limitación. El recurso necesita ser declarado localmente dentro del bloque.

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

Si en Java 7Si declaramos los recursos en el bloque externo, se lanzará un mensaje de error.

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

Para resolver este error, Java 9 Mejoró el try-with-resources sentencia, para que incluso si no se declaró la referencia de recursos localmente, también se pueda usar. El código actual se ejecutará y no lanzará ningún error de compilación.