Exercice 08 - Jacques BAPST
Transcription
Exercice 08 - Jacques BAPST
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