Cours et exercices de programmation II
-
Cours et exercices de programmation II
Cours 2 : Exceptions
Lorsqu’une erreur est détectée, les exceptions permettent de :
• transférer le contrôle à un gestionnaire d’exception (exception handler)
• de passer une valeur quelconque décrivant l’erreur (p.ex. sa raison)
Lorsqu’on programme au moyen des exceptions, on peut effectuer deux actions :
• installer un gestionnaire d’exception, qui sera activé si une exception d’un certain type se produit, et ignoré sinon
• lever une exception, ce qui transfère immédiatement le contrôle au gestionnaire d’exception du bon type installé le plus récemment, ou à défaut termine l’exécution
En Java, on utilise l’énoncĂ© try…catch pour installer un gestionnaire d’exceptions, et l’énoncĂ© throw pour lever une exception. Les exceptions sont des objets comme les autres, Ă un dĂ©tail près : ils doivent ĂŞtre des instances d’une sousÂclasse de
Throwable.
La classe Throwable possède quelques méthodes intéressantes :
• getMessage – fournit le message d’erreur
• getCause – fournit la cause de l’exception
• printStackTrace – affiche la pile d’appels
L'interpréteur cherche un bloc catch(){} à partir de l'endroit où l'exception a été créée en cherchant vers le bas. S'il ne trouve aucun bloc catch{}, l'exception est lancée dans le bloc de niveau supérieur, ainsi de suite jusqu'au bloc de la classe qui par défaut enverra l'exception au handler de l'interpréteur.
Gestionnaire qui s’applique à toutes les exceptions :
try { … } catch (Throwable e) { … }
Gestionnaire qui s’applique uniquement aux erreurs d’entrĂ©esÂsorties :
try { … } catch (IOException e) { … }
L’énoncĂ© try…finally permet de s’assurer qu’un morceau de code sera exĂ©cutĂ©, mĂŞme en prĂ©sence d’exceptions, et mĂŞme en cas de retour explicite de la fonction ! (return...) La gestion des exceptions est obligatoire sauf dans deux cas : les sousÂclasses de Error et de RuntimeException. Il est possible de chaĂ®ner les exceptions. Pour ce faire, toute exception possède une cause, qui est soit une autre exception, soit null. Le chaĂ®nage permet d’éviter que les exceptions ne dĂ©truisent l’abstraction.
Exemple :
Bloc try...finally :
private static int countLines(String fileName) throws IOException
//avertit la JVM que la fonction peut lever une IOException
//pas besoin de mettre un catch, quand on utilisera la fonction
//on sera obligé de try{}catch{} la fonction, autrement erreur
{
BufferedReader reader = new BufferedReader(new
FileReader(fileName));
try {
int count = 0;
while (reader.readLine() != null)
++count;
return count;
} finally {
reader.close();
}
}
Bloc try...catch :
public static void main(String[] args) {
if (args.length != 1) {
System.out.println('Usage: count ');
System.exit(1);
} try {
String name = args[0];
int lines = countLines(name);
System.out.println('Le fichier '+name +' contient
'+lines+' lignes');
}
catch (IOException e) {
//exécute le code suivant si le bloc try lève une IOException
//ou une autre exception « extends » Ă celleÂci, autrement
//passe le relais à l'interpréteur
System.out.println('Erreur E/S:\n'+e.getMessage());
…
Cours 3 : Généricité
class Pair {
public final F fst;
public final S snd;
public Pair(F f, S s) {
fst = f; snd = s;
}
}
Pair est une classe gĂ©nĂ©rique possĂ©dant deux paramètres de type, nommĂ©s ici F et S. DĂ©sormais, le compilateur signale une erreur lors d’une utilisation incorrecte de la paire. Pour utiliser une classe gĂ©nĂ©rique comme Pair, il faut spĂ©cifier quels types utiliser pour ses paramètres de type F et S. Par exemple, le type des paires composĂ©es d’une chaĂ®ne et d’un entier se note : Pair. On appelle un tel type une instanciation de la classe gĂ©nĂ©rique Pair. Plusieurs instanciations d’un mĂŞme type gĂ©nĂ©rique ne sont jamais sousÂtype l’une de l’autre. Le type Cell est celui des cellules dont l’élĂ©ment est de type inconnu, donc quelconque. Le compilateur n’accepte le code que s’il est certain qu’il pourra s’exĂ©cuter sans problème quelque soit le type qui remplace le joker. On dit que le type Object est la borne supĂ©rieure (upper bound) du joker, car c’est le type le plus haut dans la hiĂ©rarchie qui pourrait s’y substituer. Object est la borne supĂ©rieure attribuĂ©e par dĂ©faut aux jokers, mais il est possible d’en spĂ©cifier une autre explicitement, p.ex. : Nous pouvons Ă©galement spĂ©cifier une borne infĂ©rieure (lower bound), p. ex. : Les mĂ©thodes peuvent Ă©galement ĂŞtre gĂ©nĂ©riques. Notez que lorsqu’on appelle une mĂ©thode gĂ©nĂ©rique, il ne faut pas spĂ©cifier les paramètres de type. Ils sont infĂ©rĂ©s par le compilateur. Exemple :
cell2pair(new Cell (42)) …
Cours 4 : Introduction aux structures de données
Le paquetage java.util définit trois genres de structures de données : les listes, les ensembles et les tables associatives. A chaque genre de structure de données correspond une interface. Chaque interface est implémentée par une ou plusieurs classes, qui mettent en oeuvre la structure de données d’une certaine manière.
L’interface List
représente le concept de liste d’éléments de type E. Les opérations définies par cette interface permettent d’ajouter et de supprimer des éléments, de les parcourir, etc. - Evaluation :
-
Soyez le premier à écrire un commentaire sur ce fichier!
Veuillez vous identifier ou vous enregistrer.