Algorithmique et Programmation Orientée Objet en Java 2e année – Chapitre 4 : L

Algorithmique et Programmation Orientée Objet en Java 2e année – Chapitre 4 : Les exceptions Les entrées-sorties Version 20.0327 2 Notion d’exception 3 Vers les exceptions • Solutions possibles lorsqu’une erreur apparait • Ne rien faire • Programmation par contrat : il fallait respecter le domaine de définition documenté • Écrire un message d’erreur à l’écran • Mais le programme appelant ne « lit pas l’écran » ! • Renvoyer un code d’erreur à la place du résultat • Mais il faut réussir à le « cacher » dans le type du résultat, ce qui peut interdire un résultat valide • Mettre à jour une variable globale indiquant le code d’erreur • Par exemple un attribut de l’objet dans lequel se situe la méthode appelée • Utiliser un mécanisme d’exception unifié et standardisé • C’est un canal spécifique pour renvoyer une erreur • Cette solution évite chacun des défauts ci-dessus • Java propose en standard le mécanisme de gestion d’exception Opération ou Méthode données exception (erreur) résultat normal ou 4 Exceptions en Java À quoi servent les exceptions ? • Des sources et types d’erreurs prévus par Java • Mauvaise gestion des classes : accès hors tableau, objet non créé, … • Erreur arithmétique : division par zéro, log d’un nombre négatif, … • Entrée utilisateur non valide : saisie d’un texte au lieu d’un nombre, … • Problème de périphérique : déconnexion Wi-Fi, bourrage papier, … • Limitation physique : disque plein, … • … • Des sources et types d’erreurs ajoutés par le programmeur 5 Exemples d’exceptions de Java Exceptions déjà rencontrées • Division par zéro • L’exécution du programme est arrêtée à l’erreur static void main(String[] args) { int[] tab = {2, 1, 0, -1}; for (int val : tab) { System.out.println(20/val); } } 10 20 Exception in thread "main" java.lang.ArithmeticException: / by zero at Main.main(Main.java:7) • Accès hors tableau static void main(String[] args) { int[] tab = {4, 0, -1}; int i = 0; while (i <= tab.length) { System.out.println(tab[i]); i++; } System.out.println("done"); } 4 0 -1 Exception in thread "main“ java.lang.ArrayIndexOutOfBounds Exception: 3 at Main.main(Main.java:6) 6 Rattraper une exception pour éviter l’arrêt du programme 7 Traiter une exception Capturer et traiter des exceptions • Les blocs try{…} • Permettent de délimiter une partie du programme dont les opérations et appels de méthodes sont susceptibles de générer des exceptions que l’on souhaite traiter. • Les clauses catch(TypeException t){…} • Placées à la suite d’un bloc try, elles indiquent la réaction à une exception du type spécifié qui a stoppé défintivement l’exécution du bloc try. static void main(String[] args) { int[] tab = {2, 1, 0, -1}; try { for (int val : tab) { System.out.println(20/val); } } catch(ArithmeticException e) { System.out.println("Division par zéro"); } System.out.println("done"); } 8 Plusieurs instructions en try et plusieurs catch • Les blocs try contiennent généralement plusieurs instructions dont certaines sont susceptibles de générer des exceptions. • Ces instructions internes peuvent même contenir d’autres blocs try. • Plusieurs clauses catch peuvent être associées à un bloc try. • La première clause catch de bon type est exécutée, les autres sont ignorées. • Donc l’ordre des clauses catch est important è respecter l’ordre d’héritage. • Il est possible de générer des exceptions dans le bloc d’une clause catch. Bloc « try/catch » try { … // Instructions susceptibles de générer une exception … } catch(Type1 e) { // Capture d’exceptions de type Type1 ou dérivé … // Traitement de l’exception de Type1 … } catch(Type2 e) { // Capture d’exceptions de type Type2 ou dérivé … // Traitement de l’exception de Type 2 … } catch(Type3 | Type4 e) { // Capture d’exceptions 3 et 4 ou dérivées … // Traitement des exceptions de Type 3 et 4 } 9 Capture des exceptions Capture des exceptions (cas simple) Lorsqu’une exception survient 1. L’exécution du programme est stoppée là où survient une exception 2. On trouve le try responsable de l’appel conduisant à l’exception • englobant directement l’instruction ayant provoqué l’exception • ou sinon en remontant la chaîne des méthodes appelantes 3. Le catch approprié est exécuté pour traiter l’exception 4. Le programme suit son cours à la suite du bloc try/catch exécuté static void main(String[] args) { int[] tab = {2, 1, 0, -1}; try { for (int val : tab) { System.out.println(20/val); } } catch(ArithmeticException e) { System.out.println( "Division par zéro"); } System.out.println("Done"); } 10 20 Division par zéro Done 1 2 3 4 3 4 10 Propagation des exceptions Capture des exceptions (avec propagation) L’exception est propagée dans ce cas à elle remonte la chaîne d’appel jusqu’à trouver un try/catch qui la rattrape static void main(String[] args) { int[] tab = {2, 1, 0, -1}; try { for (int val : tab) { int res = division(20,val); System.out.println(res); } } catch(ArithmeticException e) { System.out.println( "Division par zéro"); } System.out.println("Done"); } 10 20 Division par zéro Done 3 4 static int division(int a, int b) { return a/b; } 2 2 2 3 4 Bloc try{…} non trouvé dans la méthode division(). La recherche de catch continue dans la méthode qui a appelé la méthode division(), etc. 1 11 Le bloc « finally » Bloc optionnel finally{…} • Un seul bloc finally{…} peut être placé après la liste des clauses catch. Le code contenu dans ce bloc sera toujours exécuté, soit : • Après l’exécution du bloc try{} si aucune exception n’est survenue. • Après l’exécution d’une clause catch ayant rattrapé une exception. • Avant la recherche d’un bloc try{} de niveau supérieur • quand aucune clause catch de type approprié n’a été trouvée pour rattraper une exception du bloc try{}. • quand une exception a été lancée dans une clause catch. • Exemples d’utilisation : sauvegarder des données, libérer des ressources, … try { … // Code susceptible de lancer une exception … } catch(Type1 e) { … // Traitement de l’exception de Type1 … } finally { … // Traitement exécuté quoi qu’il arrive } 12 Produire une exception d’un type déjà existant 13 Lancer une exception Une méthode peut lancer une exception • ≈ un signalement d’erreur à la place du return • Instruction pour lancer une exception : throw e; • e est une instance d’une classe héritant de la classe Throwable • Exemple 1 : throw new Exception("Message d’erreur"); • Exemple 2 : throw new ArithmeticException("Division by 0"); Méthode paramètres d’entrée exception (throw) résultat (return) ou 14 Spécifier l’exception lancée La méthode doit annoncer (dans sa signature) qu’elle peut lancer certains types d’exceptions • Spécification des exceptions lancées par une méthode • Si une méthode peut lancer une exception, cela doit être indiqué par une clause throws ClassException après la liste des paramètres de cette méthode. (Vérifié par le compilateur) à Toutes les exceptions produites sont spécifiées, y compris celles lancées dans d’autres méthodes appelées par la méthode. à Si plusieurs types d’exceptions peuvent être lancés par une méthode, on les sépare par des virgules après le throws. static int division(int a, int b) throws Exception, ArithmeticException { if (a%b != 0) { throw new Exception("Division non entière"); } return a/b; } 15 Exemple Propagation et capture des exceptions static void main(String[] args) { int[] tab = {2, 1, 3, 0}; for (int val : tab) { try { int res = division(20,val); System.out.println(res); } catch(ArithmeticException e) { System.out.println("Division par zéro"); } catch(Exception e) { System.out.println(e.getMessage()); } } } 10 20 Division non entière Division par zéro 3 3 2 2 static int division(int a, int b) throws Exception, ArithmeticException { if (a%b != 0) { throw new Exception("Division non entière"); } return a/b; } 1 2 4 16 La classe Exception de Java La classe Exception Exemple Si une exception n’est jamais rattrapée, y compris dans la méthode main, elle provoque l’arrêt du programme et la méthode printStackTrace() sera appelée. Exception - String message + Exception() + Exception(String) + String getMessage() + void printStackTrace() … // Constructeur par défaut // Constructeur avec un message d’erreur // Récupérer le message d’erreur // Afficher la liste des méthodes appelantes lors du throw try { int res = division(20,3); } catch(Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } Division non entière java.lang.Exception: Division non entière at Main.division(Main.java:17) at Main.main(Main.java:6) 17 Les autres classes de Java Les classes classiques autour des exceptions • RuntimeException (et Error) sont des exceptions techniques qui sont « discrètes » dans le code Java car non vérifiées (unchecked) : • partie throws facultative dans les déclarations des méthodes pouvant les lancer • donc bloc try/catch facultatif dans les méthodes pouvant les recevoir Throwable Error Exception RuntimeException IOException ArithmeticException NullPointerException Erreurs de la JVM Erreur du programme Erreur d’entrée-sortie FileNotFoundException ... ... ... 18 Nouveaux types d’exceptions définis par le programmeur 19 Les autres classes de Java Les classes classiques autour des exceptions • On peut créer ses propres classes d’exception à en héritant de Exception ou d’une de ses classes filles Throwable Error Exception RuntimeException IOException ArithmeticException NullPointerException Erreurs de la JVM Erreur du programme Erreur d’entrée-sortie uploads/Management/ algorithmique-et-programmation-orientee-objet-en-java-notion-d-x27-exception.pdf

  • 29
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager
  • Détails
  • Publié le Aoû 30, 2022
  • Catégorie Management
  • Langue French
  • Taille du fichier 2.9506MB