Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

Java Quiz #24

Que fait le code suivant ? (astuce : résolution en deux étapes)

  1. public class Switcher {
  2. public static void main(String[] args) {
  3. int i = 0;
  4. int j = 0;
  5. switch (i) {
  6. case j:
  7. System.out.println("A");
  8. case j + 1:
  9. System.out.println("B");
  10. i = 3;
  11. break;
  12. default:
  13. System.out.println("E");
  14. break;
  15. case j + 2:
  16. System.out.println("C");
  17. case j + 3:
  18. System.out.println("D");
  19. i = 10;
  20. break;
  21. }
  22. }
  23. }

Réponse :
Ce quiz était relativement simple, malgré les subtilités syntaxiques introduites dans le bloc switch.

Mais tout d'abord, comme l'a indiqué Charles dans les commentaires, il fallait trouver que le programme ne compilait pas.
Selon la Java Language Specification, §14.11, les expressions de branchement ("case...") doivent être des constantes à la compilation.

Dans notre exemple, la variable j n'est pas une constante, ce qui provoque une erreur de compilation. Il suffit de la qualifier final pour résoudre le problème :

  1. final int j = 0;

Le programme peut alors compiler et afficher :

  1. A
  2. B

La syntaxe du bloc switch était volontairement torturée, afin de vous rappeler ces quelques points :

  • L'expression d'un case peut résulter d'un calcul, à condition que ce calcul puisse être réalisé par le compilateur et donner une valeur constante. Une fois la variable j déclarée final, les expressions "j+1", "j+2" et "j+3" répondent à ce critère.
  • A l'exécution, le programme entre dans le premier bloc case correspondant à la valeur de la variable testée, et exécute toutes les instructions jusqu'à la fin du bloc switch, à moins de rencontrer une instruction break. Ici, le programme rentre par le "case j", imprime A et B, puis sort du bloc grâce au "break".
  • Changer la valeur de la variable testée n'a aucun effet une fois le point d'entrée déterminé. Dans notre exemple, l'instruction "i=3" ne provoque pas l'exécution du bloc de code associé au "case j+3".
  • Enfin, il est possible de placer le bloc "default" n'importe où : il est habituellement placé en dernier, mais ce n'est pas une obligation.

Commentaires

1. Le mercredi 10 décembre 2008, 12:27 par Charles.w

Dans un premier temps, on pourrait être tenté de dire que ce programme affiche quelque chose...et en y regardant de plus près, ce programme ne peut pas compiler...je me trompe ?

2. Le mercredi 10 décembre 2008, 12:40 par Charles.w

Dans la JLS, il est dit "switch statements require constants on each case", j n'est pas une constante, donc le programme ne compile pas. Mettre un final devant le j permet au programme de compiler, et d'afficher "A B".

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.