Comment le compilateur Java gère-t-il le bloc de commutation suivant? Quelle est la portée de la variable «B»?
Notez que la variable «B» n'est déclarée que dans la première branche de l'instruction de commutation. Tenter de le déclarer dans la deuxième sucragère, il en résulte une erreur de compilation "double variable locale". P> Remarque: le code ci-dessus compile avec un compilateur Java 1.6. p> p>
7 Réponses :
La portée est, tout comme d'habitude, délimitée par { code> et
} code>. p>
Message à op, vous pouvez mettre des accolades autour de chaque cas, puis cela fonctionnerait. Comme dans Case 1: {Dohere (); Pause; } code>
La portée du Vous pouvez envelopper chaque case code> dans un bloc-propre comme p> B code> est le bloc. Vous n'avez qu'un seul bloc qui inclut tout
cas code> s. C'est pourquoi vous obtenez une erreur de compilation lorsque vous redéclare
b code> dans votre deuxième
case code>.
case 0:
{
int b = 1;
...
}
case 1:
{
int b = 2;
...
}
L'erreur Compile n'est pas de redéclaring i> B code> mais d'y accéder avant son initialisation.
B CODE> est parfaitement valide dans le cas 0, 1 et par défaut, car comme vous le mentionnez, c'est dans la portée. Le problème avec sa ligne commentée ne compilait pas que B n'est pas initialisé avant d'avoir accès.
J'aurais dû lire la question plus prudent. Je pensais qu'il faisait int b = 2 code> dans la ligne de sortie commentée ;-)
Votre case code> Les blocs n'ont aucune portée locale. Ce n'est pas une série de
si code> ...
ele si code> ...
ele code> blocks, Java implémente-la comme une série de
goto < / code> s. p>
La portée de Cependant, vous devez Sachez que si vous déclarez le Pour répondre à la question que vous posez dans les commentaires Java Vous pouvez vérifier cet exemple plus simple: p> espère que cela aide. < / p> p> B code> est le bloc de commutation - entre la déclaration et le délimiteur
} code> -
int b code> à l'intérieur du boîtier
1: code>, vous n'aurez pas accès à la variable
B code> à l'intérieur du boîtier
0: code> p>
Dans votre code si A n'est pas égal à 0 B ne sera jamais initialisé. Vous devriez définir B avant la déclaration de commutation. P>
Le problème est à la compilation, pas au moment de l'exécution.
La portée des variables définies dans un interrupteur Par conséquent, chaque variable définie dans une instruction code> () code> est visible pour l'ensemble du bloc, une fois qu'il est défini. P> () code> serait la même que dans un bloc normal qui est surround par
{ code> et
} code >. p>
Vous pouvez définir la portée à l'aide de {} autour de votre cas.
int a = 3; switch( a ) { case 0: { int b = 1; System.out.println("case 0: b = " + b); break; } case 1: { // the following line does not compile: b may not have been initialized // System.out.println("case 1 before: b = " + b); int b = 2; System.out.println("case 1 after: b = " + b); break; } default: { int b = 7; System.out.println("default: b = " + b); } }