2012-07-23 2 views
0
class Monitor { 
    TheManager manager; 
    Map<String, Subject> subjectMap; 
    public Monitor() { 
    TheManager manager = new TheManager(); 
    Map<String, Subject> subjectMap = new HashMap<String, Subject>(); 
    } 

    public void addObject(String objName, Object obj) { 
    if(objName == null) System.out.println("name null"); 
    if(obj == null) System.out.println("obj null"); 
    if(manager == null) System.out.println("manager null"); 
    manager.addObject(objName, obj); 
    } 
} 

관리자가 null이기 때문에 널 포인터 예외가 발생합니다. 코드의 다른 곳에서 Monitor 객체를 인스턴스화했습니다. 내가 "addObject"메소드를 사용하려고 할 때, "manager null"을 인쇄하기 직전에 NPE를 제공합니다 (분명히 있기 때문에).Java에서이 객체가 null 인 이유를 설명 할 수 있습니까?

내가 여기 아주 기본적인 것을 놓치고있는 것처럼 느껴진다. 아무도 도와 줄 수 있니?

+0

관리자와 subjectMap을 '최종'으로 설정하면 컴파일러가 오류를 발견했을 수 있습니다. – Neil

+0

그 이유를 설명해 주시겠습니까? 에서와 마찬가지로 최종 결정은 무엇입니까? – Archer

+1

'final'은 변수에 정확히 한 번만 지정해야합니다. 클래스 멤버의 경우 생성자에서 할당을 수행해야합니다.이 코드 스 니펫에서는 완료 코드에 반드시 필요한 것은 아니지만 합당한 작업입니다. 멤버를 할당하는 것을 잊어 버리면 클래스가 컴파일되지 않습니다. – Neil

답변

6

귀하의 생성자는 subjectMap에 대한

TheManager manager = new TheManager(); 

대신

this.manager = new TheManager(); 

같은 게임이 포함되어 있습니다.

+0

'this.'는 물론 꼭 필요한 것은 아니지만,이 경우 더 명확하게 지정하는 데 도움이됩니다. – dimo414

+0

개체가 선언 된 것으로 생각했습니다. type name = new type(); "this"라는 키워드를 사용하는 이유는 무엇입니까? – Archer

+0

"개체 선언"하지 마십시오. 당신이 한 일은 : a) "새 인스턴스 만들기"("새 유형()"부분)와 함께 "새 참조 선언"(유형 이름 부분)과 c) " 인스턴스 "('='부분). 실수로 새 참조의 이름이 객체의 변수를 "숨 깁니다". 이미'Monitor' 인스턴스에 참조가 있으므로 a)는 필요 없습니다. 그런 다음 c)가 틀리면,'Monitor.manager'가 새로운 인스턴스를 가리 키기를 원합니다. –

2

사용자는 관리자, 즉 개체 필드를 할당하지 않습니다. 생성자에서 대신 로컬 변수를 할당합니다. 변수가 필드를 음영 처리합니다.

1

managersubjectMap을 두 번 정의하고 있습니다. 일단 생성자 안에 그리고 클래스에 한 번. 생성자에서 이들을 할당하면 클래스가 아닌 생성자의 범위 내에 있습니다. 생성자 내의 선언을 제거해야합니다.

1

영어로 나는 자바에서 그것을 설명 할 수는 없지만, 내가 할 수있는 : P 당신은 아무것도 설정되어 있지 않습니다

TheManager manager; 

변수 인스턴스가

공지 사항.

TheManager manager = new TheManager(); 

생성자의 끝에서 범위를 벗어날 : 그런 다음 생성자에서 당신은 다른 변수를 만들 수 있습니다. 인스턴스 변수를 참조하려면 새 로컬 필드 대신 인스턴스 생성자에서 행 시작 부분에서 TheManager을 제거하십시오.

관련 문제