2010-06-17 11 views
7

À ma grande surprise ce code fonctionne très bien:Quand les références sont-elles déclarées dans une instruction switch?

int i = 2; 
switch(i) { 
case 1: 
    String myString = "foo"; 
    break; 
case 2: 
    myString = "poo"; 
    System.out.println(myString); 
} 

Mais la référence de chaîne ne doit jamais être déclarée? Se pourrait-il que toutes les variables dans chaque cas soient toujours déclarées quoi que ce soit, ou comment cela est-il résolu?

+1

Toutes les déclarations faites au début du bloc {...} ne les contiennent-elles pas? –

+0

Je pense que Jules a raison. Java a des étendues statiques donc le flux de contrôle n'influence pas la création (par opposition à l'initialisation) de la variable. L'emplacement sur la pile est attribué lors de l'entrée dans le bloc de commutation. Mais c'est toujours une sorte de curiosité. GCC refuse de compiler le code C équivalent pour (je pense) la même raison que Java refuse de compiler 'if (someBool) String s =" foo ";' – musiKk

Répondre

7

Eh bien, il s'agit de parenthèses (c'est-à-dire de portée).

Il est préférable pratique, sans doute, d'écrire vos déclarations comme ceci:

int i = 2; 
switch(i) { 
    case 1: { 
     String myString = "foo"; 
     break; 
    } 
    case 2: { 
     myString = "poo"; 
     System.out.println(myString); 
    } 
} 

(je ne suis pas près d'un compilateur Java en ce moment, mais cela ne devrait pas compiler).

+0

J'ai appris quelque chose de nouveau aujourd'hui! –

+2

En effet il ne compile pas. – musiKk

+0

@musikk: Merci de confirmer, ce n'est pas souvent que je suis heureux que quelque chose ne compile pas :) –

3

La portée de la déclaration myString est le bloc de commutation (où le caractère {est). Si vous deviez l'écrire comme ceci, la déclaration serait par cas:

int i = 2; 
switch(i) { 
    case 1: { 
     String myString = "foo"; 
     break; 
    } 

    case 2: { 
     String myString = "poo"; 
     System.out.println(myString); 
    } 
} 
Questions connexes