2010-06-17 8 views
7

이 코드는 잘 작동 : 문자열 참조가switch 문에서 참조가 선언되는 시점은 언제입니까? 놀랍게도

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

그러나 선언해서는 안됩니다? 무엇이든지 상관없이 항상 모든 변수가 선언되었거나 어떻게 해결 될 수 있습니까?

+1

모든 선언이 포함 된 {...} 블록의 시작 부분에서 완료되지 않았습니까? –

+0

쥘이 옳다고 생각합니다. Java는 정적 범위를 가지므로 제어 흐름은 변수의 초기화 (초기화와 반대)에 영향을 미치지 않습니다. 스위치 블록을 입력하면 스택의 위치가 할당됩니다. 그러나 여전히 골동품입니다. GCC는 (나는 생각한다) 자바가'if (someBool) String s = "foo";를 컴파일하는 것을 거부하는 것과 같은 이유로 C 코드를 컴파일하는 것을 거부한다; – musiKk

답변

7

글쎄, 대괄호 (범위)에 관한 것입니다.

그것은 더 연습, 틀림없이, 다음처럼 문을 작성할 수있다 :

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

(내가 지금 자바 컴파일러 근처에 아니지만, 그 컴파일해서는 안됩니다).

+0

나는 오늘 새로운 것을 배웠다! –

+2

실제로 컴파일되지 않습니다. – musiKk

+0

@musikk : 확인해 주셔서 고마워요. 저는 뭔가가 컴파일되지 않는다고 자주 행복합니다. :) –

3

myString 선언의 범위는 스위치 블록입니다 (여기서 {문자}). 이것처럼 쓰려면 다음과 같이 선언하십시오.

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

    case 2: { 
     String myString = "poo"; 
     System.out.println(myString); 
    } 
} 
관련 문제