Académique Documents
Professionnel Documents
Culture Documents
Pr ADG
UADB - 2022
Plan du cours
v Chapter 1: Rappel sur les Exceptions
v Chapter 2: Threads
v Chapter 3: Interfaces graphiques
v Chapter 4: JDBC
v Chapter 5: Collections
v Chapter 6: Fichiers
v Chapter 7: Programmation réseau: Sockets
2
Chapitre 1: Les Exceptions
3
Exceptions
q Lorsqu’un programme traite des données, il peut arriver deux types de
situations gênantes :
§ On peut lui demander d’enlever un élément d’une liste vide. Il est possible de
traiter ce problème tout de suite, en disant que le résultat, dans ce cas, est
une liste vide ;
§ On peut aussi demander la valeur du premier élément d’une liste vide. Dans
ce cas, on ne peut pas répondre. La seule chose possible est de dire qu’il y a
une erreur à cet endroit, et charge à d’autres d’essayer de réparer cette
erreur.
q Dans le premier type de situations, il est possible de modifier le code en
séparant les cas (içi, liste vide ou liste non vide),pour éliminer le problème.
q Le deuxième cas est plus gênant, car on ne peut pas le traiter au niveau actuel. Il
faut arrêter de faire ce qui était en cours, et signaler l’erreur. On appelle cela une
Exception.
4
Hiérarchie des exceptions
12
Améliorations
Une bonne gestion des exceptions doit toujours permettre à l’utilisateur, s’il
le désire de pouvoir continuer l’exécution du programme après détection d’une
anomalie. Dans l’exemple précédent de la classe Except01 , la méthode division
déclenche bien une exception qu’elle ne traite pas et la méthode appelante (ie la
méthode main aussi ne la traite pas non plus. C’est pourquoi le programme ne
se poursuit pas pour exécuter l’instruction System.out.println ("Merci !" ).
L’intérêt de l’exemple précédent est simplement d’avoir des informations plus
parlantes sur la nature de l’exception.
13
Principales méthodes d’une Exception
Tous les types d’exceptions possèdent les méthodes suivantes:
q getMessage(): retourne le message de l’exception
System.out.println (e.getMessage());
Résultat affiché: /by zero
q toString(): retourne une chaine qui contient le type d’exception et le
message de l’exception
System.out.println (e.toString());
Résultat affiché: java.lang.ArithmeticException
17
Générer plusieurs exceptions
Dans l’exemple précèdent, on ne gérait qu’un seul type d’exception (la division
par zéro). Maintenant, nous allons voir comment prendre en compte plusieurs
exceptions dans le programme.
On rajoute, par exemple, une exception provoquée par une taille négative d’un
tableau d’entiers.
On verra en même temps comment transmettre de l’information au gestionnaire
d’exception.
En fait il faut exploiter les méthodes de la classe Exception.
18
Exemple avec plusieurs gestionnaires d’exception
public class Except03 {
public static int [] suite( int n) throws TailleTableauNegative {
int tab[ ] = new int [n];
if (n < 0 ) throw new TailleTableauNegative ( );
for( int i = 0;i < tab.length;i++) tab[i] = i;
return tab; }
public static float division( float a, float b) throws DivisionParZero
{ if (b = = 0 ) throw new DivisionParZero( );
return a / b;
}
public static void main(String[] args) {
try { System.out.println(suite(-5)); System.out.println(division(1,2)); }
catch (TailleTableauNegative ex)
{ System.out.println("erreur: "+ex.getMessage()); }
catch(DivisionParZero e)
{System.out.println("message d'erreur: "+e.getMessage());
} }}
class TailleTableauNegative extends Exception{ }
19
class DivisionParZero extends Exception{ }
Commentaires
Dans cet exemple, le choix du bon gestionnaire est toujours réalisé en examinant le type
de l’objet transmis au bloc catch (se rappeler que lancer une exception c’est produire
un objet de type classe d’exception.
Si, en parcourant un bloc try une exception est rencontrée mais n’est traitée par aucun
bloc catch, alors c’est la classe standard de l’exception ( faisant partie de l’API) qui est
invoquée par le compilateur pour la traiter.
En réalité, lorsque vous créez des classes d’exception, vous ne faites que personnaliser
une classe d’exception de l’API dans le but d’avoir des informations plus parlantes
quant à la nature de l’exception.
Aussi, on n’est pas sensé, à priori, connaître les classes de bases de l’API pour la
gestion des exceptions (exemple savoir qu’il y a une classe ArithmeticException qui
gère les erreurs dues à des calculs algébriques impossibles ou erronées). Mais, il faut
savoir qu’il y a une super classe Exception qui englobe la gestion de toutes formes
d’exception (et il est toujours possible de dériver de cette classe pour gérer une
exception quelconque).
20
Exceptions standards (API)
ServerNotActiveException
Exception de serveur non actif pour une opération à distance.
SQLException
Exception SQL : Structure Query Language (BatchUpdateException, SQLWarning).
NoSuchMethodException
Exception de méthodes introuvables.
ClassNotFoundException
Exception de classe chargée avec un nom erroné.
BadLocationException
Exception de mauvaise localisations d'une ressource.
NoSuchMethodException
Exception de méthodes introuvables.
21
Exemple avec exceptions de l’API
public class Except03 {
public static int [] suite( int n) throws NegativeArraySizeException {
int tab[ ] = new int [n];
if (n < 0 ) throw new NegativeArraySizeException ( );
for( int i = 0;i < tab.length;i++) tab[i] = i;
return tab; }
public static float division( float a, float b) throws ArithmeticException
{ if (b = = 0 ) throw new ArithmeticException( ); Pile d’exécution
return a / b; du programme
}
public static void main(String[] args) {
try { System.out.println(suite(-5)); System.out.println(division(1,2)); }
catch (NegativeArraySizeException ex)
{ System.out.println("erreur: "+ex.getMessage()); ex.printStackTrace(); }
catch(ArithmeticException e)
{System.out.println("message d'erreur: "+e.getMessage());
} }}
22
Méthode déclenchant et traitant une exception
Dans l’exemple précèdent, les exceptions déclenchées dans les méthodes
suite et division sont traitées dans la méthode main.
Le traitement est dans ce cas différé.
23
Exemple de déclenchement et traitement simultanés
public class Except03 {
public static int [] suite( int n) {
int tab[] = null;
try { tab = new int [n];
for ( int i = 0;i < tab.length ;i++) tab[i] = i;
}
catch ( NegativeArraySizeException e) { System.out .println ("Erreur sur la taille");
e.printStackTrace () ; }
return tab; }
public static float division( float a, float b)
{ float resultat = 0;
try { resultat = a / b; }
catch ( ArithmeticException ex) { System.out .println("Erreur arithmetique");
ex.printStackTrace () ;}
return resultat; }
public static void main(String[] args) {
System.out.println(suite (-5)); System.out.println (division(1,2));
24
Principales méthodes d’une Exception
Tous les types d’exceptions possèdent les méthodes suivantes:
q getMessage(): retourne le message de l’exception
System.out.println (e.getMessage());
Résultat affiché: /by zero
q toString(): retourne une chaine qui contient le type d’exception et le
message de l’exception
System.out.println (e.toString());
Résultat affiché: java.lang.ArithmeticException
27
Traiter l’exception
Deux solutions:
q Soit utiliser le bloc try catch
try {
cp.retirer (mt2);
} catch (Exception e) {
System.out.println (e.getMessage ());
}
Scénario 2:
Montant à verser: 5000
Solde Actuel: 5000.0
Montant à retirer:7000
Solde Insuffisant
Solde Final=5000.0
30
Exemple: Générer une exception non surveillée
de type RuntimeException
public class Compte {
private int code;
private float solde;
public void verser (float mt) {
solde=solde+mt;
}
public void retirer (float mt) {
if (mt>solde) throw new RuntimeException(" Solde insuffisant");
solde=solde-mt;
}
public float getSolde() {
return solde;
}
}
31
Utilisation de la classe Compte
En faisant appel à la méthode retirer, le compilateur ne signale rien
C’est une exception non surveillée. On est pas obligé de la traiter pour que le programme soit compilé
public class Application {
public static void main (String[]args) {
Compte cp=new Compte ();
Scanner clavier=new Scanner (System.in);
System.out.println(" Montant à verser: ");
float mt1=clavier.nextFloat();
cp.verser(mt1);
System.out.println(" Solde actuel:" +cp.getSolde());
System.out.println(" Montant à retirer:");
float mt2=clavier.nextFloat();
cp.retirer(mt2); // Le compilateur signe l’exception
}
}
32
Personnaliser les exceptions métier
q L’exception générée dans la méthode retirer, dans le cas où le solde
est insuffisant est une exception métier
q Il est plus professionnel de créer une nouvelle exception nommée
SoldeInsuffisantException de la manière suivante:
public class SoldeInsuffisantException extends Exception{
public SoldeInsuffisantException (String message) {
super (message);
}
}
qEn héritant de la classe Exception, nous créons une exception
surveillée
qPour créer une exception non surveillée, vous pouvez hériter de la
classe RuntimeException
33
Chapitre 2: THREADS JAVA
Points de vue système:
Processeur et temps machine
– Programmation concurrentielle:
• lancer plusieurs threads en parallèle
• utile si plusieurs tâches concurrentes ou
indépendantes
• bonne idée si contexte multi-processeurs et/ou
multi-cores
Exemple Gagner du temps
Threads Java
Les threads peuvent être créés comme instance d’une classe dérivée de la
classe Thread. Elles sont lancées par la méthode start ( ) (pour allouer
les ressources système nécessaires), qui demande à
l’ Ordonnanceur de threads de lancer la méthode run ( ) du thread.
La méthode run ( ) doit être implantée dans le programme.
Le schéma ci-après illustre les temps d’exécution et de latence des threads:
Thread 1
Thread 2
Thread 3
Thread 4
40
Types de threads
Les threads utilisateurs se terminent lorsque les instructions dans le corps de leur
méthode run ( ) sont toutes exécutées.
Un thread démon continue indéfiniment si aucune précaution n’a été prise pour
l’arrêter.
Nous commencerons par étudier les threads dits utilisateurs pour terminer sur
une analyse portant sur les threads démons.
41
Cycles de vie d’un Thread (1/2)
État nouveau C’est l’état initial après l’instanciation du thread. Le thread est
opérationnel mais n’est pas encore actif. Un thread prend toujours cet
état après son instanciation.
État exécutable Un thread est dans cet état à partir du moment où il a été lancé par la
méthode start ( ) et le reste tant qu’il n’est pas sorti de la méthode
run ( ) . Le système donnera du temps d’exécution à votre thread dès
qu’il le pourra.
Il s’agit de thread qui n’exécute aucun traitement et ne consomme
État en attente aucune ressource CPU. Il existe plusieurs manières de mettre un
thread en attente:
- appeler la méthode Thread.sleep ( long temps_en_millisecondes)
- appeler la méthode wait ( )
- appeler une ressource bloquante (flux, accès base de données, …) 42
- accéder à une instance sur laquelle un verrou a été posé
Cycles de vie d’un Thread (2/2)
État mort Il s’agit d’un thread qui est sorti de sa méthode run ( ) soit de façon
naturelle, soit de manière subite (exception non interceptée).
43
Constructeurs de Thread
44
Méthodes de la classe Thread
46
Premier Thread avec java.lang.Thread
Un appel de la méthode start ( ) dans une instruction de la forme new FirstThread("thread 1").start ( ) ;
assure qu’un thread sera bien pris en compte par la machine virtuelle et par le système d’exploitation
puis lance l’exécution de la méthode run ( ) de l’objet thread correspondant.
L’usage de la méthode statique sleep (long millis) nous permet de voir que les deux threads s’exécutent
en apparente simultanéité.
Cette méthode peut lever une exception de type InterruptedException qu’il faut donc intercepter et
capturer.
La méthode start ( ) ne peut être appelée qu’une une seule fois pour un thread donné, sinon une
exception de type IllegalThreadStateException est levée.
Il est possible d’appeler la méthode run ( ) pour chaque thread mais cela entraîne l’exécution complète
du thread 1 puis celle complète du thread 2.
L’appel de sleep entraînerait alors l’exécution d’autres threads autres que ceux–ci, donc ralentissement
de l’exécution de notre programme. 48
Deuxième Thread avec java.lang.Runnable
(le premier exemple réalisé ici avec l’interface Runnable)
Avec cet deuxième exemple, pour lancer l’exécution d’un thread, nous sommes
dans l’obligation d’instancier un objet de la classe implémentant Runnable:
SecondThread objetRun = new SecondThread ("thread 1");. 1
Mais cet objet n’est pas de type Thread, c’est pourquoi on ne peut pas lui appliquer
directement la méthode start ( ), il faut absolument l’enroller dans un autre objet
de type Thread pour pouvoir lancer son exécution via l’appel de start ( ).