dernière variable de cas dans l'instruction switch
final int a = 1;
final int b;
b = 2;
final int x = 0;
switch (x) {
case a:break; //ok
case b:break; //compiler error: Constant expression required
}
/* COMPILER RESULT:
constant expression required
case b:break;
^
1 error
*/
Pourquoi suis-je obtenir ce genre d'erreur? Si je l'aurais fait final int b = 2
, tout fonctionne.
- définir comme
final int b;
rendra comme variable. - donc avant de vous init il a la valeur null
- et enfin, il initialisée, pourquoi ce commutateur expression qui n'accepte pas les variables?
- à l'aide d'un commutateur équivalent à if - else, ce n'est pas une bonne utilisation de la carte au lieu de cela, il a accepté de n'importe quel Objet comme une clé.
- Romain, de quoi parles-tu? 🙂
- êtes-vous sûr de commenter la bonne question? Une simple demande.
- Les erreurs de compilation sont la partie de la question...
Vous devez vous connecter pour publier un commentaire.
b
peut ne pas avoir été initialisé et il est possible d'être affectés à plusieurs valeurs. Dans votre exemple, il est évidemment initialisé, mais probablement le compilateur n'a pas à savoir que (et il ne peut pas). Imaginez:Le compilateur a besoin d'une constante dans le
switch
, mais la valeur deb
dépend d'une variable externe.if
clause vous utilisez une méthode complexe qui récupère la valeur de la base de données ou une autre source externe.final int a = 1;
et de l'utiliser commex=3*a*a
compilateur d'optimiser votre code et de le remplacera
avec1
dans votre code octet, c'est pourquoi vous pouvez l'utiliser danscase a:break;
mais depuisb
peut être déclaré, plus tard, commefinal int a = new Random().nextInt()
compilateur ne sera pas en mesure de prédire ceb
sera et ne sera pas en mesure de la remplacer par une constante qui est nécessaire pourcase
paramètre, c'est pourquoi vous voyez votre erreur.final
comme constante (autorisé danscase
), si elle est initialisée dans la déclaration de la fonction.b
peut ne pas avoir été initialisé..." alors oui, peut-être re-mot un peu. Compilateur t savoir sib
est sûr d'être initialisé ou non, quand il est utilisé.final int I=1;
) et d'exécution (final int I; I=1;
) l'initialisation d'unfinal
variable, pas uncertainity d'initialisation avant de l'utiliser.Le cas dans les instructions de commutation doivent être des constantes à moment de la compilation. La commande
affecte la valeur de
2
àb
, droit au moment de la compilation. Mais la commande suivante affecte la valeur de2
àb
à Runtime.Ainsi, le compilateur se plaint, quand il ne peut pas trouver une constante dans l'un des cas de la
switch
déclaration.La dernière variable sans valeur qui lui est assignée est appelée une variable vide. Un vide final ne peut être attribuée qu'une fois et doit être assignée lorsqu'une cession ou une fois dans le programme.
Pour ce faire, un compilateur Java exécute une analyse des flux de veiller à ce que, pour chaque affectation à un vide final de la variable, la variable est non attribuées définitivement avant la cession; sinon, une erreur de compilation se produit
C'est pourquoi, lorsque le compilateur compile le commutateur de construire, il est en train de jeter l'expression constante nécessaire parce que la valeur de b n'est pas connue du compilateur.