Exercice 08 - Jacques BAPST

publicité
Programmation Java / Exercices dirigés
E08 - Exceptions
1 A l'exécution, le programme ci-contre génère
une erreur.
package e08;
Où se trouve effectivement l'erreur ?
Stack-Trace :
public static char extPos(String s, int p) {
if (s != null && s.length()>0)
return s.charAt(p);
else
return '?';
}
10
public static void main(String[] args) {
String txt = "Un texte quelconque";
scan(txt);
}
15
5
public static void scan(String t) {
int cnt=0, len=t.length();
java.lang.StringIndexOutOfBoundsException:
String index out of range: 19
for (int i=len; i>(len/2); i--) {
if (extPos(t, i)=='e') cnt++;
}
System.out.println(cnt);
java.lang.String.charAt(String.java:444)
e08.Ex0801.extPos(Ex0801.java:7)
e08.Ex0801.scan(Ex0801.java:21)
e08.Ex0801.main(Ex0801.java:14)
Exception in thread "main"
1
public class Ex0801 {
Analyser la Stack-Trace produite et indiquer
sur quelle ligne de code de quel fichier l'on doit
d'abord porter son attention si l'on cherche à
comprendre la cause de l'erreur.
at
at
at
at
Classes
I1 + T1
20
}
}
25
2 Analyser le code suivant sans utiliser Eclipse, et indiquer si le compilateur va générer des erreurs.
Déterminer ensuite ce que va afficher ce programme lors de son exécution.
public class Ex0802 {
public static void m2() {
try {
System.out.println("m2:Before");
g();
System.out.println("m2:After");
}
catch (IllegalArgumentException e) {
System.out.println("m2:Catch");
}
finally {
System.out.println("m2:Finally");
}
System.out.println("m2:End");
}
public static void g() throws Exception {
System.out.println("g:Before");
throw new Exception("Exception1");
System.out.println("g:After");
}
public static void m1() throws Exception {
try {
System.out.println("m1:Before");
g();
System.out.println("m1:After");
}
catch (Exception e) {
System.out.println("m1:Catch");
throw new Exception("Exception2");
}
System.out.println("m1:End");
}
public static void main(String[] args) {
m1();
System.out.println("----------");
m2();
}
}
Vérifier ensuite avec Eclipse en profitant d'expérimenter l'effet de différents changements dans le code.
3 Dans le code source Ex0803.java fourni se trouve une méthode solveEquation() qui résout une
équation quadratique.
a) Modifier la méthode solveEquation() de telle manière que les erreurs qu'elle peut produire soient
signalées par des exceptions (par ex. du type IllegalArgumentException) qui seront traitées dans
la méthode main().
Dans la méthode main() répéter la lecture des paramètres (coefficients) et l'affichage de la solution
(ou d'un message d'erreur) jusqu'à ce que l'utilisateur souhaite arrêter l'application.
b) Même exercice que a) mais, dans cette variante, les exceptions seront traitées dans la méthode
solveEquation() elle-même.
A votre avis, quelle variante est préférable ?
4 Répondre aux questions suivantes :
a) Peut-on écrire un bloc try sans un bloc catch associé ?
b) Un bloc finally peut-il exister sans bloc try associé ?
c) Comment pouvez-vous garantir que toutes les erreurs que peut provoquer une instruction (un appel de
méthode par exemple) soient traitées ?
d) Si plusieurs types d'exceptions sont traités, dans quel ordre les blocs catch doivent-ils être placés ?
e) Quelle est la différence entre throw et throws ?
EIA-FR  PR1_E08.doc
04.11.2013
1
Téléchargement