10
votes

Commutateur Java: Déclaration et portée variables

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". xxx

Remarque: le code ci-dessus compile avec un compilateur Java 1.6.


0 commentaires

7 Réponses :


22
votes

La portée est, tout comme d'habitude, délimitée par { et } .


1 commentaires

Message à op, vous pouvez mettre des accolades autour de chaque cas, puis cela fonctionnerait. Comme dans Case 1: {Dohere (); Pause; }



12
votes

La portée du 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>.

Vous pouvez envelopper chaque case code> dans un bloc-propre comme p>

case 0:
   {
     int b = 1;
     ...
   }
case 1:
   {
     int b = 2;
     ...
   }


2 commentaires

L'erreur Compile n'est pas de redéclaring B mais d'y accéder avant son initialisation. B 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 dans la ligne de sortie commentée ;-)



0
votes

Votre case Les blocs n'ont aucune portée locale. Ce n'est pas une série de si ... ele si ... ele blocks, Java implémente-la comme une série de goto < / code> s.


0 commentaires

4
votes

La portée de B est le bloc de commutation - entre la déclaration et le délimiteur } - xxx

Cependant, vous devez Sachez que si vous déclarez le int b à l'intérieur du boîtier 1: , vous n'aurez pas accès à la variable B à l'intérieur du boîtier 0:

Pour répondre à la question que vous posez dans les commentaires Java Vous pouvez vérifier cet exemple plus simple: xxx

espère que cela aide. < / p>


0 commentaires

1
votes

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.


1 commentaires

Le problème est à la compilation, pas au moment de l'exécution.



0
votes

La portée des variables définies dans un interrupteur () serait la même que dans un bloc normal qui est surround par { et } .

Par conséquent, chaque variable définie dans une instruction () est visible pour l'ensemble du bloc, une fois qu'il est défini.


0 commentaires

4
votes

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);
}
}


0 commentaires