1 Java Avancé Les exceptions Rémi Forax

Slides:



Advertisements
Présentations similaires
Le mécanisme des exceptions
Advertisements

La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Cours 9 Exceptions (fin) Généricité. POO-L3 H. Fauconnier2 Chaînage d'exceptions  Une exception peut être causée par une autre.  il peut être utile.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Les erreurs communes en Java.
12/04/ Les exceptions Cours 11 Cours 11.
Gestion de la concurrence avec Entity Framework Développement d’application avec base de données Chapitre 23 Hugo St-Louis – Automne 2015.
Le débogage Semaine 12 Version A15. Plan de leçon - Débogage  Commentaire javadoc  Définition  Fonctionnement  Point d’arrêt  Exécution  Contrôler.
C++ Les fonctions. Présentation Utilité : Dès qu'un programme dépasse la centaine de lignes de code, il est pratique de pouvoir le décomposer en plusieurs.
Stéphane Frénot, Frederique Laforest, Frédéric Le-Mouël IJA 1 TD 6 IJA Structures de données JAVA.
CINI – Li115 1 Semaine 6 Les fonctions ● Pourquoi écrire des fonctions ? ● Définition de fonctions ● Fonction main ● Appels de fonctions ● Portée des variables.
1 Programmation en C++ Fonctions ● Déclaration et définition de fonctions ● Arguments ● Surcharge ● Arguments optionnels ● Fonctions constantes ● Fonctions.
1 Programmation en C++ C++ de base ● Programme C++ ● Variables, objets, types ● Fonctions ● Namespace ● Tests ● Boucles ● Pointeurs, références.
1 Programmation en C++ C++ de base ● Programme C++ ● Variables, objets, types ● Types et opérations fondamentales ● Tests ● Boucles ● Pointeurs, références.
Javadoc Javadoc permet la création d'une documentation de vos travaux, au format HTML, avec liens... La encore (cohérence du langage Java !!), l'idée est.
Présentation python : Épisode 3 ● Comment programmer comme un gentilhomme ? ● Le style de code ou comment bien présenter ● Les test unitaires ou comment.
Langages de programmation TP6
JAVA.
Comment corriger son code sans forcément appeler l’enseignant M2202
java : l'héritage (rappel)
Environnement de développement des BD
APIs Concurrentes Rémi Forax
Les Instructions Itératives (Les Boucles)
Les Exceptions Rémi Forax
Pas de variable globale
Les notions de classe et d'objet
Détection des erreurs.
Algorithmique et programmation de modèles numériques
Chapitre 6 La gestion des Exceptions et les assertions
Javadoc et débogueur Semaine 03 Version A17.
Master Réseaux et Systèmes Distribués (RSD) Algorithmique des systèmes
I21 Algorithmique et programmation II
Concurrence Opérations atomiques Rémi Forax
Principes de programmation (suite)
Algorithmique Langage C
11ième Classe (Mardi, 18 novembre) CSI2572
Les fonctions.
Javadoc et débogueur Semaine 03 Version A16.
Principes de programmation (suite)
Les exceptions Rémi Forax
Tableau et héritage Y[] yA=new Y[3]; X[] xA=yA; //ok xA[0]=new Y();
Bonnes pratiques Orienté Objet et Java
L’I NSTRUCTION DE T EST A LTERNATIF Réalisé par : OUZEGGANE Redouane Département de Technologie Faculté de Technologie – Université A.Mira, Bejaia Année.
L ES I NSTRUCTIONS I TÉRATIVES (L ES B OUCLES ) Réalisé par : OUZEGGANE Redouane Département de Technologie Faculté de Technologie – Université A.Mira,
Puzzler.
Programmation en C++ C++ de base
1 RECURSIVITE PRESENTATION Ch. PAUL ALGORITHMIQUE Présentation de la récursivité.
Programmation Orientée Objet C# El Akel Bouchra ISMONTIC Tanger 2013/2014.
Calcul Scientifique Initiation à SCILB
Développement d’applications interactives
Bases de données sous Access. Initiation aux bases de données  Structure d’une base de données.
Le Java premiers pas.
Les classes et les objets
B. Liskov, Program Development in Java, chap. 4 Exceptions
Les exceptions Le mécanisme des exceptions est destiné à permettre aux fonctions profondes d'une bibliothèque de notifier la survenue d'une erreur aux.
1 Exception && Structure dynamique Exception && Structure dynamique Mohammed OUANAN.
Schéma de conception Factory Method Exemple
Principes de programmation (suite)
INTERFACE ET POLYMORPHISME
LISTES.
Présentation Chaînage dynamique Retour sur les tableaux
STREAMS (et fichiers).
Lecture/Écriture de fichiers (I/O)
Variables et accès en Java
Chapitre 11 Exceptions.
Retour sur les interfaces
Jérôme CUTRONA PHP objet Jérôme CUTRONA 08:30:34 Programmation Web
Bases de données Singleton pour la connexion
TP N°1 : GUI en NetBeans Module R & C Université de Jijel
Transcription de la présentation:

1 Java Avancé Les exceptions Rémi Forax

2 Les Exceptions ● Mécanisme qui permet de reporter des erreurs vers les méthodes appelantes. ● Problème en C : – prévoir une plage de valeurs dans la valeur de retour pour signaler les erreurs. – Propager les erreurs “manuellement” ● En Java comme en C++, le mécanisme de remonté d’erreur est gérée par le langage.

3 Exemple d'exception ● Un exemple simple ● Le bytecode (.class) contient – Le nom du fichier source – Le nom de chaque méthode et une table qui associe des offsets dans le code et des numéros de ligne public static void main(String[] args) { System.out.println(args[0]); } $ java ExceptionExample Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at ExceptionExample.main(ExceptionExample.java:8)

4 Comment ca marche ? ● Lors de la création d'une exception (le new), l'exception enregistre la pile des méthodes appelantes (fillInStackTrace()) ● Lors du throw, l'exception descent la pile d'appels jusqu'à être attrapée par un catch – La VM fait aussi des throw (null, borne des tableaux, etc) – Si il n'y a pas de catch, la VM appel printStackTrace() sur l'exception après être remonté du main()

5 Types d'exceptions Il existe 4 classes d'exceptions Throwable Error Exception RuntimeException Arbre de sous-typage des exceptions

6 2 Types d'exceptions Le langage Java (pas la VM) oblige à attraper les sous-type de Throwable qui ne sont pas des sous- type de Error ou RuntimeException – On peut soit ● attraper (try/catch) l'exception ou ● dire que la méthode appelante devra s'en occuper (throws) Il y a donc deux types d'exceptions – checked: le language oblige à les attraper – non-checked: pas d'obligation

7 Les exceptions levées par la VM correspondent sont toutes unchecked ● Les Errors – erreurs de compilation ou de lancement ● NoClassDefFoundError, ClassFormatError – problème de ressource ● OutOfMemoryError, StackOverflowError ● Les RuntimeException – des erreurs de programmation ● NullPointerException, ArrayIndexOutOfBoundsException, ArithmethicException Exceptions levées par la VM

8 Le programmeur va utiliser des exceptions pour assurer : – Que son code est bien utilisé NullPointerException/IllegalArgumentException – Que l'état de l'objet est bon IllegalStateException – Que le code fait ce qu'il doit faire AssertionError Il faut de plus gérer toutes les exceptions qui sont checked (IOException par ex.) Exceptions et programmeur

9 Exemple de pré-conditions public class Stack { private final Object[] array; private int top;... public void push(Object object) { Objects.requireNonNull(object); if (top >= array.length) throw new IllegalStateException("stack is full"); array[top++] = object; } public Object pop() { if (top <= 0) throw new IllegalStateException("stack is empty"); Object object = array[top]; array[top--] = null; // GC ! return object; } Pré-conditions

10 Et les commentaires... Le code doit avoir des commentaires de doc public class Stack { /** This class implements a fixed size stack of objets. */ public class Stack { /** Put the object on top of the stack. value value to push in the stack. NullPointerException if the object is null IllegalStateException if the stack is full. */ public void push(Object value) {... } /** Remove the object from the top of the stack. the value on top of the stack. IllegalStateException if the stack is empty. */ public Object pop() {

11 Prog. par contrat Il n'est pas rare de voir dans les codes plus compliqué en plus des pré-conditions – Post-conditions sont utilisées pour : ● vérifier que les opérations ont bien été effectués assert, AssertionError – Invariants sont utilisées pour : ● Vérifier que les invariants de l'algorithme sont préservés. assert, AssertionError

12 Exemple public class Stack { private final Object[] array; private int top;... public void push(Object object) { Objects.requireNonNull(object); if (top>=array.length) throw new IllegalStateException("stack is full"); array[top++] = object; assert object == array[top - 1]; assert top >= 0 && top <= array.length; } public Object pop() { if (top<=0) throw new IllegalStateException("stack is empty"); Object object = array[top]; array[top--] = null; // GC ! assert object == array[top + 1]; assert top >= 0 && top <= array.length; return object; } Pré-condition Post-condition Invariant

13 Le mot-clé assert ● Le mot-clé assert permet de s'assurer que la valeur d’une expression est vraie ● Deux syntaxes : – assert test; assert i==j; – assert test : mesg; assert i==j:"i not equals to j"; ● Par défaut, les assert ne sont pas exécutés, il faut lancer java -ea (enable assert)

14 public class NonNullList { private final ArrayList list;... public void add(Object o) { //Objects.requireNonNull(o) ooops ! list.add(o); } public void transfer(Queue queue) { for(int i = 0; i < list.size(); i++) { Object o = list.get(i); assert o != null : a list element can't be null; queue.offer(o); } } } assert et AssertionError Si le test booléen du assert est faux, la VM lève une exception AssertionError Exception in thread "main" java.lang.AssertionError: a list element can't be null at NonNullList.transfer(NonNullList.java:15) at NonNullList.main(NonNullList.java:23)

15 Checked Exception ● Une checked Exception hérite de Throwable ou de Exception ● Le langage Java oblige – soit à attraper l'exception avec un try/catch – soit à indiquer que l'on propage celle-ci avec un throws ● On ne doit mettre un try/catch que si l'on peut faire quelque chose d'intelligent dans le catch – Au lieu de e.printStackTrace(), il faut utiliser throws !

16 Attraper une exception try/catch permet d'attraper les exceptions public static void main(String[] args) { int value; try { value=Integer.parseInt(args[0]); } catch(NumberFormatException e) { value=0; } System.out.println("value "+value); } pas obligatoire

17 La directive throws Indique qu'une exception peut-être levée dans le code mais que celui-ci ne la gère pas (pas de try/catch). throws est nécessaire que pour les Throwable/ Exception (pas les Error ou les RuntimeException) public static void f(String author) throws OhNoException { if ("dan brown".equals(author)) throw new OhNoException("oh no"); } public static void main(String[] args) { try { f(args[0]); } catch(OhNoException e) { tryToRecover(); }

18 Multi-catch On peut attraper plusieurs exceptions, en les séparant par un | public static void main(String[] args) { MethodHandle mh; try { mh = lookup().findStatic(Integer.class, "parseInt", methodType(int.class, String.class)); } catch (NoSuchMethodException | IllegalAccessException e) { logger.warning(e.getMessage()); System.exit(1); throw null; // System.exit() peut ne pas fonctionner } System.out.println(mh); }

19 Catch et initialisation de variable Le compilateur vérifie tout les chemins possibles public static void main(String[] args) { int value; try { value = Integer.parseInt(args[0]); } catch(ArrayIndexOutOfBoundsException e) { return; } catch(NumberFormatException e) { value = 0; } System.out.println("value "+value); } Sinon cela ne compile pas

20 Catch inatteignable ● Attention, les blocs catch sont testés dans l'ordre d'écriture ! ● Un catch inatteignable est un erreur public class CatchExceptionExample { public static void main(String[] args) { int value; try { value=... } catch(Exception e) { value=1; } catch(IOException e) { // jamais appelé value=0; } System.out.println("value "+value); }

21 Throw precis Un catch sur un super-type est considérée comme une union des exceptions pouvant être levée public MethodHandle getMH() throws NoSuchMethodException, IllegalAccessException { try { return lookup().findStatic(Integer.class, "parseInt", methodType(int.class, String.class)); } catch (ReflectiveOperationException e) { logger.warning(e.getMessage()); throw e; }

22 Le bloc finally Sert à exécuter un code quoi qu'il arrive (fermer un fichier, une connection, libérer une ressources) Le catch n'est pas obligatoire. FileReader reader = new FileReader(args[0]); try { doSomething(reader); } finally { reader.close(); }

23 Finally et throw precis Un block finally est traduit en recopiant le contenu à la fin du block try et dans un catch Throwable qui utilise le throw precis FileReader reader = new FileReader(args[0]); try { doSomething(reader); reader.close(); } catch(Throwable e) { reader.close(); throw e; }

24 Try avec une ressource La syntaxe try() permet d'appeler le close() automatiquement à la fin du bloc. La variable doit être un sous-type d'AutoCloseable Si l'appel à close() lève une exception alors que le bloc a déjà levé une exception, elle est stockée en tant d'exception supprimée (getSuppressed()) de l'exception déjà existante try(FileReader reader = new FileReader(args[0])) { doSomething(reader); } // appel close() automatiquement ici

25 Try avec plusieurs resources La syntaxe try() permet utiliser plusieurs variables, les close() seront appelées dans l'ordre inverse des déclarations try(FileReader r = new FileReader(args[0]); BufferedReader reader = new BufferedReader(r)) { doSomething(); } // appel reader.close() puis r.close()

26 Ne pas attraper tout ce qui bouge Comment passer des heures à débugger Eviter les catch(Throwable) ou catch(Exception), car on attrape aussi les runtimes (et les erreurs) !! public static void aRandomThing(String[] args) { return Integer.parseInt(args[-1]); } public static void main(String[] args) {... try { aRandomThing(args); } catch(Throwable t) { // surtout ne rien faire sinon c'est pas drôle }... }

27 Alors throws ou catch ● Si l'on appel une méthode qui lève une exception non runtime – Catch si l'on peut reprendre sur l'erreur et faire quelque chose de cohérent sinon – Throws propage l'exception vers celui qui à appelé la méthode qui fera ce qu'il doit faire

28 Exception et StackTrace ● Lors de la création d'une exception, la VM calcule le StackTrace ● Le StackTrace correspond aux fonctions empilées (dans la pile) lors de la création ● Le calcul du StackTrace est quelque chose de couteux en performance. ● Les numéros de ligne ne sont affichées que compilé avec l’option debug (pas par défaut avec ant)

29 Programmation par exception ● Déclencher une exception pour l'attraper juste après est très rarement performant (la création du stacktrace coûte cher) public class CatchExceptionExample { public static int sum1(int[] array) { // 5,4 ns int sum=0; for(int v:array) sum+=v; return sum; } public static int sum2(int[] array) { // 7,2 ns int sum=0; try { for(int i=0;;) sum+=array[i++]; } catch(ArrayIndexOutOfBoundsException e) { return sum; }

30 StrackTrace et optimisation ● Pour des questions de performance, il est possible de pré-créer une exception public class StackTraceExample { public static void f() { throw new RuntimeException(); } public static void g() { if (exception==null) exception=new RuntimeException(); throw exception; } private static RuntimeException exception; public static void main(String[] args) { f(); // appels, moyenne()=3104 ns g(); // appels, moyenne()=168 ns }

31 Le chaînage des exceptions Il est possible d'encapsuler une exception dans une autre – new Exception("msg", Throwable cause) – new Exception("msg").initCause(Throwable cause) Permet de lever une exception assez générique en indiquant précisément l'exception ayant causée le problème en tant que cause.

32 Le chaînage des exceptions (2) Comme on ne peut renvoyer que des IOException, on encapsule les SAXException dans des public void load() throws IOException { try { SAXParser parser = factory.newSAXParser(); try(InputStream input = newInputStream(get("foo.xml"))) { parser.parse(input, new DefaultHandler() public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {... } }); } } catch(ParserConfigurationException | SAXException e) { throw new IOException(e); }

33 Le chaînage des exceptions (3) Et si startElement lève une IOException, on l'encapsule puis on public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { String file = attributes.getValue("file"); List lines; try { lines = readAllLines(get(file), ISO_8859_1); } catch(IOException e) { throw (SAXException)new SAXException().initCause(e); } }); } } catch(ParserConfigurationException | SAXException e) { Throwable cause = e.getCause(); if (cause instanceof IOException) { throw (IOException)cause; } throw new IOException(e); }