103 votes

La déclaration et l'initialisation des variables à l'intérieur de Java commutateurs

J'ai une folle question à propos de Java commutateurs.

    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 l' key est à deux il a réussi à imprimer la valeur 2.
Scénario 2 - Quand je vais commenter value = 2 en case 2: il des bruits disant que le local valeur de la variable peut ne pas avoir été initialisé.

Questions :

Scénario 1 : Si le flux d'exécution ne va pas à l' case 1: (lorsque l' key = 2), alors comment fait-il connaître le type de la valeur de la variable int?

Scénario 2 : Si le compilateur connaît le type de la valeur de la variable int, alors il doit avoir accédé à l' int value = 1; expression en case 1:.(Déclaration et Initialisation). Alors pourquoi est-il sqawrk Quand je vais commenter value = 2 en case 2:, en disant: le local valeur de la variable peut ne pas avoir été initialisé.

118voto

Jon Skeet Points 692016

Instructions de commutation sont impairs en termes de portée, dans le fond. De l'article 6.3 de la JLS:

La portée d'une déclaration de variable dans un bloc (§14.4) est le reste du bloc dans lequel la déclaration apparaît, à commencer par ses propres initialiseur, y compris les plus declarators à droite dans la variable locale de déclaration.

Dans votre cas, case 2 est dans le même bloc que case 1 et s'affiche après, même si, case 1 "ne s'exécutera jamais... de sorte que la variable locale est dans le champ d'application et disponibles pour l'écriture en dépit de vous, logiquement, ne jamais "l'exécution" de la déclaration. (Une déclaration n'est pas vraiment "exécutable" bien que l'initialisation.)

Si vous commentez l' value = 2; de l'assignation, le compilateur ne sait toujours variable qui vous parle, mais vous n'aurez pas allé par le biais de tout chemin d'exécution qui lui attribue une valeur, c'est pourquoi vous obtenez une erreur comme vous le feriez lorsque vous essayez de lire d'autres pas-certainement attribué variable locale.

Je vous recommandons fortement de ne pas utiliser des variables locales déclarées dans d'autres cas - il conduit à fortement du code source de confusion, comme vous l'avez vu. Quand j'ai introduire des variables locales dans les instructions de commutation (dont je fais rarement des cas doit être très court, idéalement) d'habitude, je préfère introduire un nouveau champ d'application:

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

Je crois que c'est plus clair.

22voto

Paulpro Points 54844

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

int value = 1;

Comme:

int value;
value = 1;

L' int value partie indique au compilateur au moment de la compilation que vous avez une variable appelée valeur qui est un int. L' value = 1 partie initialise, mais ce qui se passe au moment de l'exécution, et n'arrive pas du tout si cette branche de l'interrupteur n'est pas entré.

18voto

Garbage Points 987

À partir de http://www.coderanch.com/t/447381/java-programmer-SCJP/certification/variable-initialization-within-case-block

Les déclarations sont traitées au moment de la compilation et ne dépendent pas de la le flux d'exécution de votre code. Depuis value est déclaré dans le local la portée de l'interrupteur du bloc, il est utilisable n'importe où dans le canton de le point de sa déclaration.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X