3
votes

Variables locales dans le contrôle de commutateur Java

J'ai trouvé ce cas un peu particulier:

    int x = 1;
    switch(x){
          case 0 :
             boolean b = false;
             break;
          case 1 :
             b = true; //will compile just right
             System.out.println(b); //will print true
             break;
          default:
                 System.out.println(b); //will not compile
       }

Je pense juste que c'est déroutant. Les variables locales sont dites accessibles dans tout le bloc de codes. Bien sûr, b est dans un bloc de commutation afin que je puisse comprendre qu'il est accessible dans un cas différent, même si cela semble contredire le flux de commutation qu'il ne peut pas passer par le premier cas, et par conséquent, peut ne pas déclarer et initialiser b.

Mais n'est-ce pas à nouveau contradictoire si b entre-temps est toujours inaccessible dans la branche par défaut?

Y a-t-il une exécution spéciale pour les déclarations de variables locales dans une branche de cas qu'elle exécutera, que le cas ait été mis en correspondance ou non? Si oui, pourquoi la succursale par défaut ne peut-elle pas y accéder?

Modifier pour le drapeau en double: La question ici n'est pas de savoir comment la variable déclarée dans une branche de cas n'est pas locale (comme je l'ai noté ci-dessus), mais plutôt pourquoi la variable locale déclarée dans un cas est accessible en dehors, mais pas la valeur avec laquelle il a été initialisé.

J'ai trouvé une question similaire qui, je crois, répond à ma question: Déclaration et initialisation de variables dans les commutateurs Java


3 commentaires

quelle est l'erreur de compilation pour l'utilisation de b par défaut? non déclaré ou non initialisé - très différent


@CarlosHeuberger dans eclipse, il dit qu'il n'a peut-être pas été initialisé.


donc le problème n'est pas "toujours inaccessible dans la branche par défaut"


4 Réponses :


1
votes

b devrait être accessible dans le bloc par défaut, mais vous ne l'avez pas initialisé.

Essayez:

default: 
    b = true; 
    System.out.println(b); 


2 commentaires

Je vois et je comprends. Mais comment se fait-il que la déclaration de 'b' ait été "reconnue" dans un cas qui peut ou non être exécuté, mais pas son initialisation?


histoire courte: parce que Java est spécifié de cette façon (en gros: la variable est dans la portée à l'intérieur du bloc où elle est déclarée; l'initialisation est une instruction qui est exécutée dans l'ordre dans lequel apparaît)



0
votes

La portée

b est le bloc switch . La raison de l'erreur de compilation est que b dans le bloc default peut ne pas être initialisé.

Si vous voulez que b n'existe que dans le case puis vous devez l'envelopper avec {}:

switch(x) {
  case 0 : {
    boolean b = false;
    break;
  }


0 commentaires

2
votes

Le point clé est que le cas par défaut signifie: aucun autre cas n'a été pris.

La construction switch vous permet d'avoir des variables locales dans sa portée globale, mais chaque "lecture" doit toujours voir une "écriture" préalable.

Et le compilateur peut facilement détecter que le cas par défaut n'a pas vu d'initialisation pour b .

Au-delà de cela, la raison pour laquelle vous pouvez avoir de telles attributions dans différents cas est la suivante: l'instruction de commutation globale n'a qu'un un "bloc de commutation".

Consultez la Spécification du langage Java pour plus de détails!


1 commentaires

Et le correctif "rendre le code correct" consiste à déplacer la déclaration et l'initialisation de b avant le changement.



0
votes

si x = 1 , il exécutera cas 1: et puisque vous avez une instruction break dans cas 1: , une fois qu'il rencontre l'instruction break , il sort du commutateur et n'atteindra jamais le cas default . Donc, si vous voulez que le programme exécute la casse default , remplacez x par un autre nombre autre que 0 et 1 ou supprimez le saut déclaration du cas 1:


0 commentaires