Académique Documents
Professionnel Documents
Culture Documents
Cours POO
Jean-Baptiste Mouret
mouret@isir.fr
Cours 5
Exceptions
Types d’erreurs
Concept :
seule la fonction appelante est susceptible de savoir quoi
faire en cas d’erreur
si elle ne sait pas le faire, elle délègue le traitement à sa
propre fonction appelante
etc.
Principe :
à tout moment, une fonction peut lancer une exception
l’exception est propagée à la fonction appelante
qui la propage à la fonction appelante
qui la propage à la fonction appelante
etc...
... jusqu’à ce qu’une fonction ai du code pour traiter l’erreur
... ou jusqu’à la terminaison du programme
Exemples
E x c e p t i o n i n t h r e a d "main"
java . lang . NullPointerException
a t t e s t . main ( t e s t . j a v a : 3 2 )
Questions
Les exceptions :
sont des objets (il y a donc des classes d’exception)
sont automatiquement propagées de méthodes en
méthodes
sont lancées avec l’instruction throw
Les méthodes qui peuvent lancer des exceptions doivent être
déclarées avec throws NomException (attention au s !)
Exemple
Notez :
throws TypeException : annonce que cette méthode peut
lancer l’exception TypeException
throw new TypeException() : lance l’exception
Finally
Une clause optionnelle finally permet d’excecuter du code
même en cas d’exception (exemple : fermer une ressource)
public class MaClasse {
public void maMethode ( . . . ) {
try {
/ / i c i , code generant e v e n t u e l l e m e n t
/ / une e x c e p t i o n
F i l e R e a d e r f r = new F i l e R e a d e r ( "toto.txt" ) ;
// et la suite . . .
} catch ( F i l e N o t F o u n d E x c e p t i o n e ) {
/ / t r a i t e m e n t de l ’ e x c e p t i o n
System . e r r . p r i n t l n ( "Toto.txt not found" ) ;
} finally {
f r . c l o s e ( ) ; / / ferme l e f i c h i e r
}
}
Vérification du compilateur
Concrètement :
soit on fait l’appel dans un bloc try/catch
soit on déclare que la méthode que l’on programme peut
elle aussi lancer l’exception
On dit que les RuntimeException ne sont pas vérifiées
3 remontée automatique
Clone
Copie profonde
public class P o i n t {
public P o i n t ( i n t x , i n t y ) {
this . x = x ; this . y = y ;
}
}
public class C e r c l e {
public C e r c l e ( P o i n t p ) { c e n t r e = p ; }
private Point centre ;
}
public class Test {
public s t a t i c void main ( S t r i n g [ ] arg ) {
P o i n t p1 = new P o i n t ( 2 , 2 ) ;
C e r c l e c1 = new C e r c l e ( p1 ) ;
p1 . move ( 2 , 2 ) ;
/ / c1 . c e n t r e a bouge !
}
}
On pourrait écrire :
public class P o i n t {
public P o i n t ( i n t x , i n t y ) {
this . x = x ; this . y = y ;
}
public P o i n t c l o n e ( ) / / [ a t t e n t i o n , ne f o n c t i o n n e pas ]
{
r e t u r n new P o i n t ( t h i s . x , t h i s . y ) ;
}
}
Clone en Java
Un clone correct
public class P o i n t implements Cloneable {
public O b j e c t c l o n e ( )
{ / / super . c l o n e = c l o n e de l a c l a s s e mere
P o i n t o = ( P o i n t ) super . c l o n e ( ) ;
o.x = x; p.y = y;
return o ;
}
public class C e r c l e implements Cloneable {
{
Point centre ;
public O b j e c t c l o n e ( )
{
C e r c l e c = ( C e r c l e ) super . c l o n e ( ) ;
c . centre = centre . clone ( ) ;
return c ;
}
}
public class A { }
public class B extends A { }
public class Test {
public s t a t i c void main ( S t r i n g [ ] arg )
{
A a = new B ( ) ;
A a2 = a ; / / c o p i e de r e f e r e n c e
/ / e t une c o p i e profonde ?
}
}
/ / s i on a j o u t e l e s methodes c l o n e . . .
public s t a t i c void main ( S t r i n g [ ] arg )
{
A a = new B ( ) ;
A a2 = a . c l o n e ( ) ; / / a p p e l l e l e c l o n e de B
}
}
Paquetages (package)
Concept
Buts :
créer des modules afin de mieux s’y retrouver
créer des modules réutilisables
définir un « espace de nom »(pour avoir plusieurs classes
avec le même nom dans un même projet, mais dans des
packages différents)
UML
ax
mon_package
A <<interface>>
Inter1
sous_package
B C
En Java
Avec Eclipse...
/ / i m p o r t e l a c l a s s e A r r a y L i s t du package j a v a . u t i l
import j a v a . u t i l . A r r r a y L i s t ;
/ / t o u t i m p o r t e r ( p l u s l e n t , moins p r e c i s ) :
import j a v a . u t i l . ∗ ;
Packages et visibilité
/ / c l a s s e v i s i b l e a l ’ e x t e r i e u r du package
public class A { / ∗ . . . ∗ / }
/ / c l a s s v i s i b l e uniquement dans l e package ( d e f a u t )
class B { / ∗ . . . ∗ / }
Bonnes pratiques