2012-06-22 2 views
21
public class Foo { 
    public static void main(String[] args) { 
     float f; 
     System.out.println(f); 
    } 
} 

인쇄 문은 자바의 기본 요소는 이미 default value (float = 0.0f)이있는 경우 지역 변수 f는자바 : 원시 로컬 변수를 초기화해야하는 이유는 무엇입니까?

초기화되지 않았을 수 있습니다

다음 컴파일 타임 오류, 왜해야합니까 원인 하나를 정의 하시겠습니까?


편집 : 그래서,이

public class Foo { 
    float f; 
    public static void main(String[] args) { 
     System.out.println(new Foo().f); 
    } 
} 

감사를 작동

, 모두들!

+6

편집 : 예, 작동하지만 초기화를 피하기 위해 로컬로 필드를 승격하는 것이 합당한 예가 될 수 없습니다 .-) – fvu

+1

@fvu, 예를 들어, 일부 용도로 사용됩니다. : D – user1329572

답변

41

로컬 변수이기 때문에. 이것이 할당 된 이유가 없습니다 :

로컬 변수가 약간 씩 다릅니다. 컴파일러는 기본값을 초기화되지 않은 로컬 변수에 할당하지 않습니다. 로컬 변수가 선언 된 곳에서 을 초기화 할 수 없다면 에 값을 할당해야합니다. 초기화되지 않은 로컬 변수 에 액세스하면 컴파일 타임 오류가 발생합니다.

편집 : 왜 Java에서이 컴파일 오류가 발생합니까? 우리가 IdentifierExpression.java 클래스 파일을 보면, 우리는이 블록 찾을 수 있습니다 : 언급 한 바와 같이

... 
if (field.isLocal()) { 
      LocalMember local = (LocalMember)field; 
      if (local.scopeNumber < ctx.frameNumber && !local.isFinal()) { 
       env.error(where, "invalid.uplevel", id); 
      } 
      if (!vset.testVar(local.number)) { 
       env.error(where, "var.not.initialized", id); 
       vset.addVar(local.number); 
      } 
      local.readcount++; 
     } 
... 

(if (!vset.testVar(local.number)) {), (testVar 포함) JDK 검사 변수가 할당되어있는 경우 (Vset's source code 우리가 testVar 코드를 찾을 수 있습니다). 그렇지 않은 경우는 properties file에서 오류 var.not.initialized을 제기

... 
javac.err.var.not.initialized=\ 
    Variable {0} may not have been initialized. 
... 

Source

+5

와우, 완전히 새로운 것을 오늘 배웠습니다! : D – user1329572

+1

이것은 왜 "설명"하지 않습니까? – kryger

+1

@kryger 편집을 참조하십시오. – Zakaria

5

클래스 필드 (기본값 : final 개)는 기본값으로 초기화됩니다. 지역 변수는 그렇지 않습니다.

필드가 선언 될 때 항상 값을 할당 할 필요는 없습니다. 선언되었지만 초기화되지 않은 필드는 컴파일러에서 적절한 기본값으로 설정됩니다.

는 그래서

class C { 
    float f; 
} 

f 같이 (비 final) 필드는 없습니다

void myMethod() { 
    float f; 
} 

0f하지만 로컬 변수 f 초기화한다.

로컬 변수는 언어 별 필드와 다르게 취급됩니다. 로컬 변수의 유효 기간은 유효하므로 초기화 전에 사용하면 오류 일 가능성이 큽니다. 필드가 없기 때문에 기본 초기화가 편리 할 때가 많습니다. 사실

+1

+1, 비 최후의 비트에 대한 훌륭한 정보! : D – user1329572

13

,이 경우는 지역 변수이기 때문에 , 당신의 float f에 기본 값을 할당하지 않는 컴파일러 - 아닌 필드 :

지역 변수는 약간 다릅니다; 컴파일러는 초기화되지 않은 지역 변수에 기본값을 할당하지 않습니다. 지역 변수가 선언 된 곳에서 초기화 할 수 없다면, 그것을 사용하기 전에 값을 할당해야합니다. 초기화되지 않은 지역 변수에 액세스하면 컴파일 타임 오류가 발생합니다.

2

실제로 지역 변수는 지역 variable.It에 대한 이전의 모든 값을 선물을 복용의 가능성이 stack.Hence에 저장됩니다 보안상의 이유로 큰 도전입니다 .Heence java는 사용하기 전에 로컬 변수를 초기화해야한다고 말합니다.

1

안녕 얘들 아 솔루션은 간단합니다. 힙 메모리에 저장된 값은 컴파일러 기반 데이터 형식에 의해 초기화되지만 로컬 변수는 스택 메모리에 저장되므로 명시 적으로 초기화해야합니다.

관련 문제