어떻게 내가 초기화 할 필요가 없습니다 자바를 알 수 있습니까 a
작업 프로그램을 가지고와 나에게 오류를 제공하지?
int a;
boolean b = true;
while (true) {
if (b == false) {
System.out.print(a);
break;
} else {
b = false;
a = 5;
}
}
내가 할 수없는 경우에,이 컴파일러가 디자인 된 방법입니다 이유가있다?
그것은 쉽게 이러한 컴파일러를 설계하거나이는 I 구조 조정 내 코드를 보장하는 메커니즘입니다 되었습니까?
이 같은 질문을하지 않습니다 이 하나
'오류 : A 변수가 초기화되지 않았'가요 구조의 경우이 정말 필요?
네, 그것은 필요하다. Java 언어 사양을 필요로한다. 이에 덮여 JLS (16) - 명확한 할당을 .
"그 값의 액세스가 발생할 때마다 지역 변수 (§14.4) 모든 빈 최종 필드 (§4.12.4는 §8.3.1.2)는 확실히 할당 된 값이 있어야합니다."
어떻게 내가 초기화 할 필요가 없습니다 자바를 알 수 있습니까
a
작업 프로그램을 가지고와 나에게 오류를 제공하지?
당신은 자바 것을 말할 수 없습니다. 당신은 변수 ... 또는 구조 조정 코드를 초기화해야합니다.
내가 할 수없는 경우에,이 컴파일러가 디자인 된 방법입니다 이유가있다?
자바 컴파일러가 있기 때문에 해야한다 사양을 구현하고, 그렇지 않으면 적절한 자바 컴파일러가 아닙니다. 사양은 오류 말합니다.
사양이 그것을 말한다 왜 진짜 문제입니다. 그 컴파일러 작성자가 포함 어려운 강제되지 않도록 대답은 정리 증명의 모든 자바 컴파일러의 코드.
당신이주는 예에서는 변수가 항상 초기화됩니다 프로그래머에 분명하다. 그러나, 컴파일러는 그것을 확인해야합니다. 그것은 초기화되지 않은 변수가 가질 것이기 때문에, 절대적으로 확신 할 필요가 정의되지 않은 동작을.
자동 (방향성이) 검증은 복잡한 작업이다. 등등 쓰기, 이상 (컴파일러) 버그에 수단을 더 (컴파일러) 코드를 복잡.
이 기술의 "예술의 상태는"복잡한 자바 코드에 대한 분석이 종류의 일까지이 아니다.
변수가 초기화되었는지 검증은 (이론적) 경우가 있습니다 수학적으로 불가능은 .
그래서 ... 현명하게 ... 자바 언어를 지정 사람들은 프로그래머에게이 다시 밀었다. 당신은 그 변수가되도록 코드를 작성해야 확실히 할당 JLS에 규정 된 규칙에 따라, 사용하기 전에.
그리고 역시 두 번째 이유가있다. JLS가 받아들이는 자바 컴파일러를 허용했다는 것을 가정
System.out.print(a);
경우에만 경우 그것은 그 자체를 만족시킬 수 a
있었다 (항상) 이전에 초기화. 이제 JLS의 동일한 버전을 구현하기 위해 다른 사람 (또는 다른 시간에 같은 사람)에 의해 쓰여진 두 개의 자바 컴파일러를 고려한다.
컴파일러 C1은 알아낼 수
a
항상 초기화, 프로그램이 유효 있다고한다.컴파일러 C2는 알아낼 수 없습니다
a
항상 초기화, 프로그램이 유효 있다고한다.
우리는 이제 두 개의 자바 컴파일러가 표면 상 JLS의 동일한 버전을 구현하지만, (위) 귀하의 예제 프로그램이 유효한지 여부에 동의합니다. 즉 단순히지지 할 수없는 것입니다.
더 복잡한 일에, 나는 JVM를 검증 바이트 코드가 바로로드 된 그 경우에도 발생한다 검사 "명확한 과제"와 비슷한 뭔가를 생각한다. 따라서 JLS 명확한 할당 규칙의 변경은 JVMS에 리플 것이며, 잠재적으로의 JVM 플랫폼의 행동에 영향을 미치는 다른 프로그래밍 언어와 도구 컴파일이 / JVM 바이트 코드를 직접 생성하는 것이 있습니다.