Plan
Exceptions
Générique
Autres notions de java
2
Plan
Exceptions
Générique
Autres notions de java
3
Exception
Définition : Une exception est un événement, se
produisant lors de l’exécution d’un programme, qui
interrompt l’enchaînement normal des instructions.
o Ouverture d’un fichier qui n’existe pas
o Faire une division par zero
Exception
Objets exceptions
Lorsqu’une erreur se produit dans une méthode, celle-ci crée un
objet Exception qui contient des informations sur l’erreur survenue :
o le type de l’erreur : objet null, dépassement de tableau, etc.
o la trace d’exécution du programme : la stack trace
L’action de créer un objet Exception et de le passer au système
d’exécution est appelée lever/lancer une exception
« throwing an exception »
5
Exception
Les exceptions : Mais c’est quoi une exception
6
Exception
Deux types d’ exceptions
Les exceptions surveillées (checked exception)
La gestion est requise.
Les exceptions non surveillées (unchecked exception)
La gestion à priori est impossible.
7
Exception
8
Quelques exceptions prédéfinies
Division par zéro pour les entiers : ArithmeticException
Tentative de forçage de type illégale : ClassCastException
Référence nulle : NullPointerException
Tentative de création d'un tableau de taille négative :
NegativeArraySizeException
Dépassement de limite d'un tableau :
ArrayIndexOutOfBoundsException
9
Exception
Gestion des exceptions
Lorsqu’une exception est levée, le système d’exécution
tente de trouver un handler pour cette exception (une méthode
pouvant la gérer)
Gerer une execption avec Try…catch…Finally
Transferer la gestion de l’exception avec Throws
Créer ses propres exceptions
10
Exception
Solution 1 : gestion active avec try/catch
« Essaie ce bout de code, si une exception survient
attrape la et exécute le code de remplacement ».
Syntaxe :
try
{ // instructions hasardeuses }
catch ( IOException e )
{ // que faire si une exception de type IOException survient }
catch ( NullPointerException e )
{ // que faire si une exception de type NullPointerException survient }
finally
{ // toujours faire ceci }
Exception
Les exceptions : capturer et attraper
Lorsqu’un bloc génère une erreur elle doit être
interceptée et levée
Un bloc d’instruction peut être surveillé
Attraper avec l’instruction try
Gérer avec l’instruction catch
try {
//bloc d’instruction
} catch (Type1 id1) {
//instruction à faire en cas d’erreur de type 1
12
}
Exception
Les exceptions : capturer et attraper
S’il y a plusieurs types d’exceptions
à intercepter, il faut définir autant de catch que de
type d’exceptions
try {
//bloc d’instruction
} catch (Type1 id1) {
//instruction à faire en cas d’erreur de type1
} catch (Type2 id2) {
//instruction à faire en cas d’erreur de type2
} catch (Type3 id3) {
//instruction à faire en cas d’erreur de type3
} 13
Exception
Les exceptions : capturer et attraper
try {
//bloc d’instruction
} catch (Type1 id1) {
//instruction à faire en cas d’erreur de type1
} catch (Type2 id2) {
//instruction à faire en cas d’erreur de type2
} catch (Type3 id3) {
//instruction à faire en cas d’erreur de type3
} [finally {
// facultatif
}]
Un type d’exception donnée ne doit pas venir
14
après un type d’une exception d’une super classe.
Exception
Les exceptions : capturer et attraper
try {
//bloc d’instruction
} catch (Type1 | Type2 | Type3 id3) {
//instruction à faire en cas d’erreur de type3
} [finally {
// facultatif
}
Attention à l’ordre des catch : du plus spécialisé
vers le plus générale
15
Exception
Exemple 1
import [Link];
:
class Test {
public static void main(String[] args) {
String reponse = [Link]("Quel est votre age ?");
try {
int age = [Link](reponse);
[Link]("Vous avez " + age + " ans");
} catch (NumberFormatException e) {
[Link](null, "Probleme de format");
}
}
}
Exception
• Sans l’instruction try catch, ce programme
aurait planté ! Le système aurait affiché :
17
Exception
Solution 2 : gestion passive avec throws
o Transferer la gestion de l’exception avec Throws dans la
signature
« Ce mot clé permet d’avertir le système qu’une exception
peut se déclencher dans le corps de la méthode mais que son
traitement n’est pas local : Déléguer le traitement »
Exception
import [Link];
class Util {
public static void lire() throws NumberFormatException {
String reponse = [Link]("Quel est votre age ?");
int age = [Link](reponse);
[Link]("Vous avez " + age + " ans");
}
}
class AppliUtil {
public static void main(String[] args) {
try {
[Link]();
} catch (NumberFormatException e) {
[Link]("Probleme de format"); }
}
} 19
Exception
Créer ses propres exceptions
« Pour créer sa propre classe d’exception, il suffit donc de
créer une classe qui hérite de [Link] ou de
l’une de ses classes filles »
Exception
21
Exception
Un mot pour conclure
«Il ne faut employer les exceptions que dans des situations
exceptionnelles ! Elles ne doivent pas remplacer un simple
test ! »
Plan
Exceptions
Générique
Autres notions de java
23
Généricité
Définition : La généricité permet de définir des
classes, ou des méthodes paramétrées par une ou
plusieurs autres classes.
La généricité apporte souplesse et robustesse dans le code
La généricité apporte une complexité importante
o Utiliser les classes génériques existantes n'est pas compliqué
o Créer ses propres classes génériques est plus difficile
Généricité
Définition : La généricité permet de définir des
classes, ou des méthodes paramétrées par une ou
plusieurs autres classes.
Généricité
Généricité des classes
Généricité
Généricité des méthodes
Généricité
La généricité et l’héritage
Pas de relation d'héritage entre Paire<Super> et Paire<Sous>
oPaire<Super> pSup = new Paire<Super>();
o Paire<Sous> pSous = new Paire<Sous>();
o pSup = pSous ; // INTERDIT
Généricité
Généricité et joker (wildcard : ?)
Supposons que nous définissions dans la classe X une
autre méthode pour afficher des paires de Super, de la
façon suivante :
Généricité
Généricité et joker (wildcard : ?)
Pour que la dernière instruction soit possible il faudrait
définir la méthode afficheS de la façon suivante :
Mais dans ce cas tout est possible, et si on veut se
limiter aux classes qui dérivent de Super :
Généricité
Les jokers peuvent être limités vers le haut (extends) ou
vers le bas (super).
o <?> désigne un type inconnu
o <? extends C> désigne un type inconnu qui est soit C
soit un sous-type de C
o <? super C> désigne un type inconnu qui est soit C
soit un sur-type de C
où C peut être une classe, une interface ou un paramètre de type
Plan
Exceptions
Générique
Objet prédéfinis
o [Link]
o Chaines de caractères
o Les tableaux
o Les Wrappers
32
Plan
Exceptions
Générique
Objet prédéfinis
o [Link]
o Les tableaux
o Les Wrappers
o Chaines de caractères
33
La classe Objet
• Classe mère de toutes les classes. Possède des
méthodes de base qu'il est possible de redéfinir :
– toString()
– equals() & hashCode()
– getClass()
– clone()
– finalize()
Tests d’égalité
Les opérateurs de comparaison == et != tests les
valeurs des variables
o Pour les types primitifs, on teste leurs valeurs
o Pour les types objets, on teste les valeurs leurs
références
La méthode equals()
Il existe déja une méthode equals(Object) dans Object
o Mais son implantation teste les références
Pour comparer structurellement deux objet, il faut
redéfinir le code de la méthode equals()
La méthode equals()
• On utilise instanceof qui renvoie vrai si une
référence est d'un type particulier
• null instanceof WhatYouWant renvoie false
int hashCode()
Renvoie un entier qui peut être utilisé comme
valeur de hachage de l'objet
hashcode et equals
Tout objet redéfinissant equals doit redéfinir hashcode
si l'objet doit être utilisé dans une Collection
equals et hashcode doivent vérifier
o equals est symétrique, transitive, réflexive
o x. equal s( y) implique x. hashcode( ) ==y. hashcode( )
Les valeurs de hashcode doivent être différentes pour
chaque objet de programme
hashcode doit être rapide à calculer
Class<?> getClass()
o Permet d'obtenir un objet Class représentant la classe
d'un objet particulier
o Un objet Class est un objet qui correspond à la classe de
l'objet à l'exécution
o Cette méthode est final
Le clonage
o Le clonage permet la copie d'un objet java.
o Pour pouvoir être cloné, un objet doit implanter
l'interface « [Link] ».
o La méthode « clone » de la classe objet permet le
clonage d'un objet champs par champs.
o Les champs statiques ne sont pas clonés.
Si un objet clonable contient un autre objet clonable,
celui-ci ne sera pas automatiquement cloné.
Implementation de clone: cas simple
Implementation de clone : cas difficile
void finalize()
Méthode appelé juste avant que l'objet soit réclamé par le GC
Cette méthode est protected et peut lever une exception
wait()/notify()
wait() permet d'attendre sur le verrou associé à
l'objet.
notify() permet de libérer quelqu'un en attente
sur le verrou associé à l'objet
Pour plus d'infos, voir cours sur la concurrence
Les tableaux
Il existe deux types de tableaux :
o Les tableaux d'objets, héritant de Object[], ils contiennent
des référence sur des objets
o Les tableaux de types primitifs, héritant de Object, ils
contiennent des types primitifs
Tous les tableaux implantent les interfaces Cloneable
et Serializable
Plan
Exceptions
Générique
Objet prédéfinis
o [Link]
o Les tableaux
o Les Wrappers
o Chaines de caractères
47
Initialisation et accès
Syntaxes d'initialisation :
o new type[taille]
o new type[]{valeur1,valeur2,...,valeurn-1}
[] permet d'accèder en lecture/écriture
L'accès est protégé (pas de buffer overflow) et
les tableaux sont tous mutables
Longueur et boucle
Les tableaux sont utilisables dans une boucle
foreac
.length sur un tableau permet d'obtenir sa taille
Type primitif et Objet
Il existe des classes wrapper (enveloppes) qui
permettent de voir un type primitif comme un objet
Cela permet de réutiliser un code marchant pour des
objets avec des types primitifs
Plan
Exceptions
Générique
Objet prédéfinis
o [Link]
o Les tableaux
o Les Wrappers
o Chaines de caractères
51
Les wrappers
Un wrapper est juste un objet stockant un type primitif
Conversion type primitif/wrapper
Les wrappers possèdent deux méthodes qui
permettent de faire la conversion entre un type
primitif et le wrapper
Hiérarchie des wrappers
Les relations de sous-typage entre les wrappers
ne sont pas les mêmes que celles des types
primitifs associés
Auto boxing/unboxing
En fait, la conversion est automatique
Auto boxing/unboxing
Les conversions de boxing/unboxing sont faites
avant les conversions classiques mais pas après
Plan
Exceptions
Générique
Objet prédéfinis
o [Link]
o Les tableaux
o Les Wrappers
o Chaines de caractères
57
Les chaînes de caractères
58
Les chaînes de caractères
59
Les chaînes de caractères : String
60
Les chaînes de caractères : String
o int length()
o char charAt(int index)
o int indexOf(char c)
o int indexOf(String subStr)
o int lastIndexOf(char c)
o int lastIndexOf(String subStr)
o String replace(char oldChar, char newChar)
o String substring(int start)
o String substring(int start, int end)
o … voir la documentation de Java
61
Les chaînes de caractères : String
62
Les chaînes de caractères : StringBuffer
• Du package [Link]
• Contrairement à String est mutable
• Permet de créer une créer une chaîne de
caractères par morceaux
• Création :
StringBuffer = new StringBuffer (32) ;
StringBuffer = new StringBuffer ("Allo") ;
63
Les chaînes de caractères : StringBuffer
64
Les chaînes de caractères : StringBuffer
• StringBuffer append(String s)
• int capacity()
• StringBuffer delete (int start, int end)
• StringBuffer insert (int offset, String s)
• StringBuffer reverse ()
• String subString (int start, int end)
• String toString ()
65
Fin
66