ED n°4 Exercices dirigés n°4 Résultat de l'exécution du programme suivant : public class ED4 { private int x = 0; private static int y = 0; public ED4(int x,int y){ this.x = x; this.y = y; } void println( int a ){ int x = 1; System.out.println(a); x=x+5; System.out.println(x); System.out.println(this.x); System.out.println(y); y=y+2; } public static void main( String[] args ){ ED4 obj = new ED4(5,10);obj.println(45); System.out.println(ED4.y); } } Exécuter le programme suivant (C1.java): public class C1{ public static void main(String[] args){ B b = new B(); } } class A{ public A(){ System.out.println("Je suis dans A"); } } class B extends A{ public B(){ System.out.println("Je suis dans B"); } } 1 ED n°4 Quel est le résultat de l'exécution de ce programme (C2.java)? Le constructeur sans paramètre de la classe Object est-il invoqué lorsque new B(5) est exécuté : public class C2{ public static void main(String[] args){ B b = new B(5); } } class A{ public A(){ System.out.println("Je suis dans A); } } public class B extends A{ public B(int x){ System.out.println("Je suis dans B"); } } Quels sont les problèmes identifiés à la compilation dans ce fichier source (C3.java): public class C3{ public static void main(String[] args){ B b = new B(); } } class A{ public A(int x){ System.out.println("Je vaux: "+x); } } public class B extends A{ public B(){ System.out.println("Je suis dans B"); } } La classe B peut-elle être compilée ? Quelle que soit la réponse, déterminer le modificateur le plus adapté aux membres i et m de la classe A ? // fichier A.java package p1; public class A{ int i; void m(){System.out.println("i= "+i);} } // fichier B.java package p1; public class B extends A{ public void main(String[] args){ System.out.println("i= "+i); m(); } } 2 ED n°4 Les assertions suivantes sont elles vraie ou fausse ? - un membre protected (donnée ou méthode) peut-il être accédé par n'importe quelle classe du même package ? - un membre protected (donnée ou méthode) peut-il être accédé par n'importe quelle classe de différents packages ? - un membre protected (donnée ou méthode) peut-il être accédé par ses sous-classes de différents packages ? - une classe final peut-elle être instanciée ? - une classe final peut-elle être étendue (dérivée) ? - une méthode final peut-elle être surchargée ? Déterminer 2 façons de compléter le programme suivant pour que le constructeur de la classe B initialise les variables d'instance x et y : public class A{ protected int x,y; public A( int x,int y ){ this.x = x;this.y = y; } } public class B extends A{ private int r; public B( int x,int y,int r ){ this.r = r; } } Etant donné le morceau de code : try{ m1(); throw new E1(); m2(); } catch( E2 e){...} catch(E3 e){...} m3(); - m2() sera-t-il exécuté ? - m3() sera-t-il exécuté ? Etant donné le morceau de code : try{ m1(); throw new E2(); m2(); } catch( E2 e){...} catch(E3 e){...} m3(); - m2() sera-t-il exécuté ? - m3() sera-t-il exécuté ? 3 ED n°4 Etant donné le morceau de code : try{ m1(); throw new E2(); m2(); } catch( E1 e){...} catch(E3 e){throw e;} finally{m4();} m3(); - m3() sera-t-il exécuté ? - m4() sera-t-il exécuté ? Qu'affiche le programme suivant : public class C8{ static class E3 extends RuntimeException{} static class E2 extends RuntimeException{} static class E1 extends RuntimeException{} public static void main(String[] args){ int x = 1; try{ m1(); if( x!=1) throw new E3(); m2(); } catch( E1 e){m1();} catch(E3 e){throw e;} finally{m4();} m3(); } } static static static static void void void void m1(){ System.out.println("m1");} m2(){System.out.println("m2");} m3(){System.out.println("m3");} m4(){System.out.println("m4");} - m3() sera-t-il exécuté ? - m4() sera-t-il exécuté ? 4 ED n°4 Soit le programme Java suivant: import java.util.Scanner; public class Arret { // ============================================================= public static int saisir(){ int x ; System.out.println("Entrez un entier positif : "); Scanner in = new Scanner(System.in); x = in.nextInt(); if (x < 0){ throw new Stop2(); } if (x == 0) { throw new Stop(); } return x; } // ============================================================= public static int calculer (){ int x1 = 0; int x2 = 1000; x1 = saisir(); try { x2 = saisir(); }catch (Stop e){ System.out.println("recupere une exception Stop"); } return x1+x2; } // ============================================================= public static void main(String [] args) { int y = 99999; System.out.println("Debut main"); try { y = calculer(); System.out.println("main OK"); } catch (Stop e){ System.out.println("main PB1"); } catch (Stop2 e){ System.out.println("main PB2"); } System.out.println("le resultat calcule vaut = " + y); System.out.println("main FIN"); } } class Stop extends RuntimeException {} class Stop2 extends RuntimeException {} Question 1 Exécuter ce programme pour différents couples d'entiers saisis au clavier par exemple : 1 puis 3, 1 puis 0, 0 puis 1, -1 puis 1, 1puis -1 Expliquer pour chaque exécution les affichages constatés. Question 2 Transformer la déclaration de Stop en class Stop extends Exception{};, qu'observez vous ? Comment corriger cette erreur ? 5