Déclaration et initialisation de variables dans les commutateurs Java

J’ai une question folle à propos des commutateurs Java.

int key = 2; switch (key) { case 1: int value = 1; break; case 2: value = 2; System.out.println(value); break; default: break; } 

Scénario 1 – Lorsque la key est deux, elle imprime avec succès la valeur 2.
Scénario 2 – Quand je vais commenter la value = 2 dans le case 2: ça crie en disant que la valeur de la variable locale n’a peut-être pas été initialisée .

Des questions :

Scénario 1: Si le stream d’exécution ne va pas au case 1: (quand la key = 2 ), alors comment connaît-il le type de la variable de valeur comme int ?

Scénario 2: Si le compilateur connaît le type de la variable de valeur comme int , il doit alors avoir accédé à la int value = 1; expression dans le case 1: :. (déclaration et initialisation). Alors pourquoi est-ce que sqawrk Quand je vais commenter la value = 2 dans le case 2: :, en disant que la valeur de la variable locale n’a peut-être pas été initialisée .

Les déclarations de changement sont étranges en termes de scope, essentiellement. De la section 6.3 du JLS :

L’étendue d’une déclaration de variable locale dans un bloc (§14.4) est le rest du bloc dans lequel la déclaration apparaît, en commençant par son propre initialiseur et en incluant tous les autres déclarateurs à droite dans la déclaration de la variable locale.

Dans votre cas, le case 2 est dans le même bloc que le case 1 et apparaît après, même si le case 1 ne s’exécutera jamais … La variable locale est donc disponible pour l’ écriture, même si vous (Une déclaration n’est pas vraiment “exécutable” bien que l’initialisation soit.)

Si vous commentez la value = 2; affectation, le compilateur connaît toujours la variable à laquelle vous faites référence, mais vous n’avez parcouru aucun chemin d’exécution qui lui atsortingbue une valeur, ce qui explique pourquoi vous obtenez une erreur comme vous le feriez lorsque vous essayez de lire une autre variable locale atsortingbuée de manière définitive.

Je vous recommande fortement de ne pas utiliser les variables locales déclarées dans d’autres cas – cela conduit à un code très déroutant, comme vous l’avez vu. Lorsque j’introduis des variables locales dans des instructions de commutation (que j’essaie rarement de faire, les cas doivent être très courts, idéalement), je préfère généralement introduire une nouvelle scope:

 case 1: { int value = 1; ... break; } case 2: { int value = 2; ... break; } 

Je crois que c’est plus clair.

La variable a été déclarée (en tant que int), mais pas initialisée (affectée d’une valeur initiale). Pensez à la ligne:

 int value = 1; 

Comme:

 int value; value = 1; 

La partie int value indique au compilateur à la compilation que vous avez une variable appelée value qui est un int. La value = 1 partie l’initialise, mais cela se produit au moment de l’exécution, et ne se produit pas du tout si cette twig du commutateur n’est pas entrée.

De http://www.coderanch.com/t/447381/java-programmer-SCJP/certificateion/variable-initialization-within-case-block

Les déclarations sont traitées au moment de la compilation et ne dépendent pas du stream d’exécution de votre code. Comme la value est déclarée dans la scope locale du bloc de commutation, elle est utilisable n’importe où dans ce bloc à partir du sharepoint sa déclaration.