'오류 : A 변수가 초기화되지 않았'가요 구조의 경우이 정말 필요?

우 :

어떻게 내가 초기화 할 필요가 없습니다 자바를 알 수 있습니까 a작업 프로그램을 가지고와 나에게 오류를 제공하지?

int a;
boolean b = true;
while (true) {
   if (b == false) {
       System.out.print(a);
       break;
   } else {
       b = false;
       a = 5;
   }
}

내가 할 수없는 경우에,이 컴파일러가 디자인 된 방법입니다 이유가있다?

그것은 쉽게 이러한 컴파일러를 설계하거나이는 I 구조 조정 내 코드를 보장하는 메커니즘입니다 되었습니까?

이 같은 질문을하지 않습니다 이 하나

스티븐 C :

'오류 : 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 바이트 코드를 직접 생성하는 것이 있습니다.

추천

출처http://43.154.161.224:23101/article/api/json?id=222457&siteId=1