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 :
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.
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 :
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!