2

은 내가이 컴파일 된 코드자바 컴파일러가 필드 초기화를 인식하지 못하는 이유는 무엇입니까?

int myVar; 
final boolean condition = <someCondition>; 
if (condition) { 
    myVar = 1; 
} 
if (condition) { 
    System.out.println("myVar = " + myVar); 
} 

의 다음 조각이 가정, 나는 myVar might not have been initialized 오류가 예상되었다. 이것은 컴파일러의 버그입니까? condition이 true 일 때 "myVar"가 설정되고 condition이 true 일 때만 참조되는 것을 쉽게 알 수 있습니다. (condition도 재설정되지 않습니다.)

P .: 0으로 초기화해야하는 해당 의견에 대해 알고 있습니다. (. 즉, 값이 최대 한 번 설정)하지만 요점은 내가 "myVar에"마지막 될 수있는 JLS에 설명 된대로

+1

* 왜 컴파일러입니다 * 초기화가 필요합니다. – azurefrog

+4

Java 컴파일러는 변수가 사용되기 전에 항상 변수 myVar에 할당된다는 결론을 내릴 수있는 충분한 분석을 수행하지 않습니다. 일반적으로 다른 조건문에서 조건을 상관 시키려하지 않습니다. –

+0

컴파일러가 조건이 변경되지 않는다고 생각하지 않는다고 생각합니다. 예를 들어 인터럽트 된 CPU에서 실행됩니다. 이 작업을 다시 실행하면 조건이 변경 될 수 있습니다. 신경 쓰지 마라, 나는 상태의 선언을 보지 않았다. @ 존 볼링 거는 충분히 충분 해 보입니다. – bhow

답변

4

초기화 요구 사항은 자바의 공식적인 부분을 원이다

지역 변수 또는 공백 최종 필드 x의 모든 액세스에 대해 액세스 전에 x를 반드시 지정해야하며 그렇지 않으면 컴파일 타임 오류가 발생합니다.

;

JLS는

분석은 고려 문과 식의 구조를 취 말 간다 (JLS 8, chapter 16 일본어 중점); 연산자 !, &&, ||, ? : 및 부울 값 상수 식의 특수 처리를 제공합니다. 조건 부울 연산자 표현의 &&, ||? : 및 부울 값 상수 식의, 값 의 특별한 치료를 제외하고

는 흐름 분석에서 고려되지 않습니다.

명세서는 용어로 정의하는 것이 condition는 그것을 "상수 표현"하지 않는다 final되는 것이 아니라

주 (강조 첨가). 지정이 the specific rule for if statements주고 계속 :

V는 [취소]를 V IFF에 if (e) S 후에 할당이있다 [취소] SV이 후 할당 [취소] false [e이 평가] 때 e 후 할당. 다음 특정 코드에서

:

int myVar; 

myVar 확실히 여기에 할당 된 않은입니다.S는 if 문의 본문은 무조건 할당을 수행하기 때문에

final boolean condition = <someCondition>; 
if (condition) { 
    myVar = 1; 
} 

myVar

은 "S 후 할당"된다. myVartrue 또는 false으로 평가 되든, 조건 평가 후 이 아니고이 할당됩니다. 따라서이 방법에서는 myVar이 명확하게 지정되지 않습니다. 여전히 myVar을 그 값을 읽을 수 없습니다해야한다, 그래서 확실히, 멀리 JLS 규칙에 관한 한 할당되지 않은 :
if (condition) { 

그리고 아무것도

이 시점에서 변경되었습니다. 컴파일러 따라서 다음 문에서 오류를보고 할 의무가 :

그것은 영업 이익은 이미 질문의 요점은 약이기 때문에, 것을 알고 매우 분명 @imk
System.out.println("myVar = " + myVar); 
}