2017-11-10 11 views
1

컴파일러가 지역 변수 k에 대한 Initializer 오류를 확인하는 변수의 명확한 할당을 참조합니다. 상관없이 flag 변수의 값은 k 변수의 값이 할당됩니다 아래의 시나리오에서변수의 명확한 지정

k needs to be initialized.

:

void flow(boolean flag) { 
    int k; 
    if (flag) 
     k = 3; 
    if (!flag) 
     k = 4; 
    System.out.println(k); 
} 

이 코드 조각은 컴파일 오류가 발생하지 않습니다. 여기에 컴파일 오류가 정당화 되었습니까?

+3

컴파일러는 'else'를 사용하지 않으면 두 플래그 조건을 모두 확인했다는 것을 알기에 충분하지 않습니다. 'else'를 사용하십시오. –

+3

더 좋은 질문은이 코드가 정당화 되었습니까? 왜 당신은 명시 적으로 부울의 양쪽을 검사하겠습니까? – shmosel

+2

더 나은 버전은 다음과 같습니다 :'final int k = flag? 3 : 4;'5 행 대신에 한 행, 이해하기가 더 좋으며 더하기 변수'k'는 불변입니다. – vanje

답변

2

왜냐하면 컴파일러는 최종 필드가 아닌 필드의 값을 모두 확인하지 않기 때문입니다 (flag 여기).

컴파일러는 컴파일 타임 상수를 분석하고 로컬 변수가 초기화되는지 여부 만 확인합니다. Java 언어 사양에

이것에 더 : https://docs.oracle.com/javase/specs/jls/se7/html/jls-16.html

이 같은 방법이 개 더 유사 콘텐츠를 고려 ... 여기

, 컴파일러 플래그의 값을 알고있다하더라도, 그것은 컴파일러 오류에 대한가 발생합니다 변수 k. 플래그로서 여기

void flow() { 
    boolean flag = false; 
    int k; 
    if (flag) 
     k = 3; 
    if (!flag) 
     k = 4; 
    System.out.println(k); 
} 

는 컴파일 시간 상수이며, 따라서 컴파일러 에러 컴파일 및 변수 k의 값을 계산할 수 없다.

void flow() { 
    final boolean flag = false; 
    int k; 
    if (flag) 
     k = 3; 
    if (!flag) 
     k = 4; 
    System.out.println(k); 
} 
+0

이것은 내 의문의 여지가 없습니다. 컴파일 시간 상수는 내가 주로 찾던 것이 었습니다. – Ronald

2

그렇습니다. 변수 k은 상태에 관계없이 초기화됩니다. 그러나 두 조건이 서로 관련이 없으므로 컴파일러는 k이 시간 컨트롤이 println 메서드 호출을 통해 초기화되었음을 보장 할 수 없습니다. 나는 가정하고

당신은 손에서이 문제에 대한 수정 프로그램을 알고 있지만 그런 경우가 아니라면, 당신은 단지 첫 번째 if 문 상에 else 블록 체인 다음 두 번째 if 문을 제거해야하고 있습니다.

+0

이것은 튜토리얼을 읽는 동안 나왔던 코드입니다. 솔루션이 시간 상수를 컴파일하고 있다고 생각합니다. 그렇습니다. 코드 수정 문제를 알고 있습니다. 감사합니다. – Ronald