2012-12-19 3 views
3

아래 오류로 인해 오류가 발생하는 이유는 무엇입니까? 나는 JLS에서 어디에서 이런 일을 할 수있는 제한을 찾아야할지 모르겠습니다. 컴파일 시간동일한 유형 및 같은 유형의 변수 자체를 반환하는 정적 메서드를 호출 할 때 "변수 xxx가 초기화되지 않았을 수 있습니다"

A.java:14: error: variable A might not have been initialized 
     A A = A.foo(); 
      ^
1 error 
+2

여기서 큰 단서는 오류 메시지가 "변수 A"에 대해 말하고 "A.foo()"에서 "A"를 가리킨다는 것입니다. 즉 컴파일러는 A가 변수가 아니라 유형이라고 생각했습니다. –

+3

그리고 클래스와 변수에'A'와 같은 바보 같은 짧은 이름을 붙이면 얻을 수있는 모든 것 :-) – paxdiablo

답변

7

에서

public class A { 

    static A foo() { 
     return null; 
    } 

    public static void main(String[] args) { 
     A A = A.foo(); 
    } 
} 

오류 변수는 같은 이름의 클래스를 숨 깁니다. 그게 왜 naming conventions의 일부입니까? 패트리샤는 코멘트에 주목,이 실제로 obscuring로 JLS에 알려져


: 변수 유형을 숨 깁니다 때문에

In these situations, the rules of §6.5 specify that a variable will be chosen in preference to a type, and that a type will be chosen in preference to a package.


귀하의 경우에, 당신은 컴파일 오류 선언은 메소드 호출 이전에 처리되므로 그것은 다음을 수행와 동일합니다 : 코멘트에

 
A.java:3: variable s might not have been initialized 
     String s = s.substring(0, s.length()); 
       ^
1 error 

, 당신은 JLS이 건설 불법 말한다 위치를 찾을 수없는 말 :

public class A { 
    public void foo() { 
     String s = s.substring(0, s.length()); 
    } 
} 

당신은 오류의 같은 종류를 얻을. 그것은 그 자체로 불법이 아니며, 어둡게하기 때문에 생긴 결과입니다. 때문에, 단지 혼란 불법되지 않습니다 어둡게에 당신은 또한 원치 않는 전화를 얻을 수있는이 개 클래스의 경우를 생각해

public class A { 
    public void foo() { 
     System.out.println("A.foo()"); 
    } 

    public static void main(String[] args) { 
     A B = new A(); 
     B.foo(); 
    } 

    public static class B { 
     public static void foo() { 
      System.out.println("B.foo()"); 
     } 
    } 
} 

당신은 출력은 어떻게 생각하십니까?

 
$ javac A.java 
$ java A 
A.foo() 
+4

[ "Obscuring"] (http://docs.oracle.com/javase/specs)에서 JLS를 참조하십시오. /jls/se7/html/jls-6.html#jls-6.4.2) –

+0

그러나 JLS에서 특정 부분을 찾을 수 없습니다. 이는 불법이며 변수 이름이 숨기는 것과 같은 문장에서 이름을 입력하십시오. 만약 내가 틀리면'= '연산자가 오른쪽에서 왼쪽으로 평가되므로 컴파일러가 오른쪽 (변수가 아직 존재하지 않는 곳)을 처리 할 수 ​​있고 왼쪽면을 처리 한 후, 변수의 선언과 할당, 최후의 실험적 설명 –

+0

글쎄, 아니, 컴파일러는 거꾸로 읽지 않는다. 선언은 먼저 읽혀지고 정적 메서드의 경우 RHS 식에서 형식을 유추하는 역할을 할 수 있으며 항상 형식을 확인하는 역할을합니다. 메소드 호출의 부산물이 아닙니다. –

관련 문제