2014-07-05 17 views
0

내 게시물이 제공 할 수있는 것처럼 저는 Java를 처음 접했습니다.개체를 필드로 사용할 때 Java에서 NullPointerException이 발생했습니다.

다른 클래스 (클래스 B)를 해당 필드 중 하나로 사용하는 클래스 (A 클래스라고 부름)를 만들어야합니다. 클래스 A의 생성자는 클래스 B의 생성자를 호출합니다. 지금까지는 정상적으로 작동합니다. 그러나 A의 메소드 중 하나가 B 클래스의 객체에서 B의 메소드 중 하나를 사용하려고하면 NullPointerException이 발생합니다. 이것은 아마도 너무 혼란 스럽기 때문에 Exception을 생성하는이 간단한 예제를 작성했습니다.

이 클래스 B입니다 :

public class class_B { 
    private int y; 

    public class_B(int N) {  
     int y = N*N; 
    } 

    public int class_B_method() { 
     return y; 
    } 
} 

이것은 클래스 A입니다 :

public class class_A { 
    private class_B obj; 

    public class_A(int N) {   
     class_B obj = new class_B(N); 
    } 

    public int call_class_B_method() { 
     return obj.class_B_method(); 
    } 

    public static void main(String[] args) { 

     int N =4;  
     class_A p = new class_A(N); 
     int a = p.call_class_B_method(); 
    } 

}

내가 class_A를 실행하면 내가 INT의 A = P "라인에 예외를 얻을 .call_class_B_method(); ". 'obj'가 생성자 'class_B'에 의해 만들어졌고 'call_class_B_method'메서드에서 사용할 수 있어야하므로 이해가되지 않습니다.

감사합니다.

+0

어떤 IDE를 사용하고 있습니까? 이 문제를 일으키는'class_A (int) '에서 사용되지 않는 지역 변수를 경고해야합니다. – Unihedron

답변

0

:

class_B obj = new class_B(N); 

를 작성해야 : (당신이 OBJ의 기준을 잃어 버려)

1

class_A

class_B obj = new class_B(N); 

생성자 이러한 광고는 로컬 변수 obj 아닌 obj 필드 초기화한다. 이 로컬 개체 class_B이 생성되고 거의 즉시 폐기됩니다. 일반적으로 컴파일러는 다음과 같은 두 가지 이유로 이런 상황을 경고합니다. 첫째, 필드를 "음영 처리"하는 로컬 변수가 있고 둘째, 로컬 변수가 할당 된 다음 다시 사용되지 않습니다.

이 문제를 해결하기 위해

obj = new class_B(N); 

에 코드를 변경

. 당신이 필드 obj를 참조하지 않는 class_A의 생성자에서

obj = new class_B(N); 
1

이 줄은 잘못 같은 이름의 새 (로컬) 변수를 만들고 있습니다. 이것이 구성원이 결코 인스턴스화되지 않는 이유입니다. 생성자에 obj = new class_B(N)을 써야합니다.

오류 같은 종류를 완화하기위한 몇 가지 방법이 있습니다 :

  • 필드를 선언 obj 마지막, 당신은 생성자에서 인스턴스화하지 않는 경우 다음 컴파일러는 comlain됩니다. 이 과정은 나중에 필드 값을 변경하지 않으려는 경우에만 작동합니다.
  • 항상 this을 식별자로 사용하십시오 : this.obj = new class_B(N). 이렇게하면 코드가 때때로 혼란 스러울 수 있으므로 이것이 맛의 문제라고 생각합니다.

btw.규약에 따라 Java 클래스 이름은 항상 대문자로 시작합니다. 그러나 이것은 귀하의 예를위한 경우 일 수 있습니다.

관련 문제