Maison  >  Article  >  Java  >  Le bloc final en Java

Le bloc final en Java

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-13 02:10:02573parcourir

El bloque finally en Java

Lorsque vous travaillez avec des exceptions en Java, il est courant de constater la nécessité d'utiliser un bloc try-catch pour les gérer et de ne pas simplement déléguer leur gestion à celui qui appelle cette partie du code . Cependant, il est parfois nécessaire d'effectuer certaines actions, qu'une exception ait été levée ou non, ou que le flux d'exécution du programme se soit terminé avec succès, par exemple la fermeture d'un fichier, une connexion à une base de données, etc.

Pour ces cas, le bloc final est utilisé. Ce bloc est placé après le bloc catch, voire après le bloc try si aucun bloc catch n'est utilisé. Le code placé à l'intérieur du bloc enfin sera exécuté dans deux scénarios :

  • Lorsque le bloc try se termine et qu'aucune exception n'a été levée.
  • Lorsqu'une exception se produit, le flux d'exécution sera interrompu et le bloc catch sera exécuté.

Exemple 1

Considérons une méthode de division qui reçoit deux entiers et renvoie le résultat de la division entre eux. Cela utilise un bloc try-catch pour gérer l'exception levée lors d'une tentative de division par zéro, ainsi qu'un bloc final pour imprimer un message indiquant que les ressources sont en cours de nettoyage.

public static int divide(int a, int b) {
        try {
            return a / b;
        } catch (ArithmeticException e) {
            System.out.println("Error: " + e.getMessage());
            throw e;
        } finally {
            System.out.println("Cleaning up resources...");
        }
    }

En appelant la méthode Divide avec les valeurs 10 et 2, le résultat suivant sera obtenu :

Cleaning up resources...
5

Comme nous pouvons le voir, aucune exception n'a été levée, donc la méthode a renvoyé le résultat de la division et le bloc final a été exécuté, bien que la sortie du bloc final soit affichée en premier. En revanche, si la méthode Divide est appelée avec les valeurs 10 et 0, le résultat suivant sera obtenu :

Error: / by zero
Cleaning up resources...
Exception in thread "main" java.lang.ArithmeticException: / by zero ...

Dans ce cas, une exception a été levée, donc le flux d'exécution a été interrompu et le bloc catch a été exécuté, mais avant de lancer à nouveau l'exception, le bloc final a été exécuté. Dans les deux exemples nous avons vu que le bloc final est toujours exécuté, quel que soit le résultat obtenu.

Exemple 2

L'utilisation principale du bloc enfin est de libérer les ressources qui ont été utilisées dans le bloc try, comme la fermeture d'un fichier, d'une connexion à une base de données ou d'une connexion réseau. Pour illustrer cela, considérons une méthode readFile qui lit le contenu d'un fichier et renvoie la première ligne. Cela utilise un bloc try-catch pour gérer l'exception levée si le fichier ne peut pas être lu, ainsi qu'un bloc enfin pour fermer le fichier.

public static String readFile() throws IOException {
    FileReader reader = null;
    try {
        reader = new FileReader("file.txt");
        BufferedReader buffer = new BufferedReader(reader);
        return buffer.readLine();
    } catch (IOException e) {
        System.out.println("Error: " + e.getMessage());
        throw new RuntimeException(e);
    } finally {
        if (reader != null) reader.close();
    }
}

Dans le cas où la méthode readFile est exécutée et que le fichier ne peut pas être lu, le résultat suivant sera obtenu :

public static int divide(int a, int b) {
        try {
            return a / b;
        } catch (ArithmeticException e) {
            System.out.println("Error: " + e.getMessage());
            throw e;
        } finally {
            System.out.println("Cleaning up resources...");
        }
    }

Comme nous pouvons le voir, une exception a été levée, donc le flux d'exécution a été interrompu et le bloc catch a été exécuté, mais avant de lancer à nouveau l'exception, le bloc final a été exécuté pour fermer le fichier. En revanche, si un fichier file.txt est créé avec le contenu Hello world! et la méthode readFile est appelée, le résultat suivant sera obtenu, sans lever aucune exception :

Cleaning up resources...
5

Certains aspects à prendre en compte dans cet exemple sont :

  • La variable reader a été déclarée en dehors du bloc try afin qu'elle soit accessible à partir du bloc final, c'est-à-dire qu'elle se trouve dans la portée des deux blocs.
  • Vérifié si la variable du lecteur est différente de null avant d'essayer de fermer le fichier, car si le fichier ne peut pas être ouvert, cette variable restera nulle et lancera une exception lors de la tentative de fermeture.
  • L'exception possible que la méthode close peut lever en essayant de fermer le fichier dans le bloc final n'est pas gérée et est propagée dans la signature de la méthode, au cas où vous voudriez la gérer, vous pouvez l'envelopper dans un try-catch bloquer à l'intérieur du bloc final.

Conclusion

L'utilisation definally au sein de Java est devenue si courante que le langage lui-même propose une alternative qui nous permet de simplifier la gestion des ressources, le bloc try-with-resources. Ce bloc se charge de fermer automatiquement les ressources à la fin de leur utilisation, il n'est donc pas nécessaire d'utiliser un bloc final pour libérer les ressources. Cependant, il est important de noter que le bloc final est toujours utile dans certains cas et que les deux options peuvent être utilisées ensemble.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn