[JAVA] try-with-resources et fermeture automatique

Je pensais que try-with-resources ne pouvait être utilisé que pour des choses qui soulèveraient généralement des exceptions IO. Il semble qu'il puisse être activé pour différentes classes avec AutoCloseable.

À propos d'essayer avec des ressources

L'instruction try-with-resources est une instruction try qui déclare une ou plusieurs ressources. Les ressources sont des objets qui doivent être fermés une fois le programme terminé. L'instruction try-with-resources garantit que chaque ressource est fermée à la fin de l'instruction. Vous pouvez utiliser n'importe quel objet qui implémente java.lang.AutoCloseable en tant que ressource, y compris tous les objets qui implémentent java.io.Closeable.

Oracle Java Documentation https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

En d'autres termes, si vous implémentez AutoCloseable, vous pouvez prendre en charge try-with-resources!

À propos de la fermeture automatique

Un objet qui peut contenir une ressource (comme un fichier ou un handle de socket) jusqu'à ce qu'il soit fermé. La méthode close () d'un objet AutoCloseable est appelée automatiquement lorsqu'elle quitte le bloc try-with-resources où l'objet est déclaré dans l'en-tête de spécification de ressource. Cette structure garantit une libération rapide et évite les exceptions de pénurie de ressources et autres erreurs possibles. Inclus dans le package java.lang.

Interface AutoCloseable https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/AutoCloseable.html

Je veux que try-with-resources se ferme automatiquement à la fin de l'instruction try, Mettez également en œuvre l'interface AutoCloseable pour la ressource cible pour laquelle vous souhaitez qu'un processus spécial soit inséré lors de la fermeture.

À propos de la fermeture automatique et de la fermeture

Semblable à AutoCloseable, il existe Closeable. Il s'agit d'une interface qui hérite d'AutoCloseable et est incluse dans le package java.io. AutoCloseable lève une exception lorsqu'une exception se produit, tandis que Closeable lève une IOException.

La plupart des classes du package java.io implémentent Closeable, donc Les classes telles que FileOutputStream et BufferedReader peuvent être déclarées avec try-with-resources.

utilisation

Si vous souhaitez libérer des ressources automatiquement avec try-with-resources Il est utilisé lorsque vous souhaitez ajouter d'autres traitements lors de la libération de ressources.

SampleTryWithResources.java


public class SampleTryWithResources {
    public static void main(String[] args) {

//     Closeable(AutoCloseable)La classe qui implémente
//    try-with-S'il est déclaré avec des ressources, il sera automatiquement fermé à la fin de l'instruction try.()Est exécuté.
        try (SampleCloseAble sca = new SampleCloseAble()) {
            System.out.println("Try-With-Début des ressources");

            System.out.println("Instruction d'essai en cours");

            System.out.println("Try-With-Fin des ressources");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class SampleCloseAble implements AutoCloseable {
    @Override
    public void close() throws Exception {
        System.out.println("Clôture de la classe Closeable()Courir");
    }
}

sys.out


Try-With-Début des ressources
Instruction d'essai en cours
Try-With-Fin des ressources
Clôture de la classe Closeable()Courir

La méthode close implémentée après la fin du traitement dans l'instruction try est appelée. Cependant, notez que la méthode close est appelée avant l'instruction catch lorsqu'une exception se produit dans l'instruction try, comme illustré ci-dessous.

SampleTryWithResources2.java


public class SampleTryWithResources2 {
    public static void main(String[] args) {

        try (SampleCloseAble sca = new SampleCloseAble()) {
            System.out.println("Try-With-Début des ressources");

            System.out.println("Instruction d'essai en cours");

            throw new Exception();
        } catch (Exception e) {
            System.out.println("Essayer la fin de l'exception de l'instruction");
            e.printStackTrace();
        }
    }
}

sys.out


Try-With-Début des ressources
Instruction d'essai en cours
Clôture de la classe Closeable()Courir
Essayer la fin de l'exception de l'instruction
java.lang.Exception
	at ...

L'ordre de traitement est Traitement dans l'instruction Try ⇒ Méthode de fermeture AutoCloseable ⇒ Traitement dans l'instruction catch Sera.

Recommended Posts

try-with-resources et fermeture automatique
[Java] Différence entre fermable et fermable automatiquement
== et égal