déc.
2008
Java Quiz #24
Que fait le code suivant ? (astuce : résolution en deux étapes)
public class Switcher { public static void main(String[] args) { int i = 0; int j = 0; switch (i) { case j: System.out.println("A"); case j + 1: System.out.println("B"); i = 3; break; default: System.out.println("E"); break; case j + 2: System.out.println("C"); case j + 3: System.out.println("D"); i = 10; break; } } }
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 :
final int j = 0;
Le programme peut alors compiler et afficher :
A 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 variablej
déclaréefinal
, 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 blocswitch
, à moins de rencontrer une instructionbreak
. 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
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 ?
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".