2013-05-08 3 views
0

클래스 내부의 객체가있는 배열을 통해 반복 문제가 발생합니다. 여기에 약간의 데모를 작성하면 따라갈 수 있습니다.클래스 내부의 객체 배열을 반복합니다.

Tank tanks[] = new Tank[2]; 
tanks[0] = new Tank(); 
tanks[1] = new Tank(); 
tanks[0].doStuff(tanks); 

doStuff(Tank[] tanks) { 
    for (int i = 0; i < tanks.length; i++) { 
     if (tanks[i].equals(this)) continue; 
     // Do stuff 
    } 
} 

그래서 Tank 유형의 배열이 있습니다. 그런 다음 Tank 클래스 내부에서 doStuff 메소드를 호출합니다. 메서드는 배열을 가져 와서 루프합니다. 그리고 나는 그 클래스의 현재 인스턴스가 아닌 모든 탱크에 물건을 넣기를 원합니다. 내 코드와이 설명을 이해할 수 있기를 바랍니다.

문제

내가 잘못 여기서 뭐하는 거지 if (tanks[i].equals(this))

에 대한 NullPointerException이 얻을 무엇입니까?

+2

그 코드의 ==을 사용할 수 있습니다)를 배열로 사용합니다. 질문을 편집하여 문제를 시연하는 짧지 만 완전한 * 프로그램을 제공하십시오. –

+0

equals 메서드가 다시 구현 되었습니까? 그렇다면 보여줄 수 있습니까? 이 null이 올 것이라고 생각하는 유일한 곳이지만, 다시 구현하고 잘못된 작업을 수행 한 경우에만 가능합니다. 나머지는 깨끗합니다. –

+0

@JonSkeet이 구문을 사용하여 배열을 만들 수 있습니다. 이상하지만 변수 이름에 배열로 선언했습니다. –

답변

8

즉, tanks[i]은 null입니다. (또는 오버라이드 된 equals() 메서드에 버그가 있음)

확인해야합니다.

+2

제공된 코드의 특성. –

+2

@AnthonyGrist : 제공되는 코드가 자동으로 편집 된 후에도 컴파일되지 않는다고 가정 할 때, 실행중인 실제 코드를 대표하지는 않습니다. –

1

나는이 코드를 실행하면 :

public class Tank { 
    public static void main(String[] args) { 
    Tank tanks[] = new Tank[2]; 
    tanks[0] = new Tank(); 
    tanks[1] = new Tank(); 
    tanks[0].doStuff(tanks); 
    } 

    public void doStuff(Tank[] tanks) { 
     for (int i = 0; i < tanks.length; i++) { 
      if (tanks[i].equals(this)) continue; 
      // Do stuff 
     } 
    } 
} 

오류가 발생하지합니다. 따라서 .equals을 재정의 한 것이므로 NullPointerException이 발생합니다. 또 다른 가능성은 간단한 예제가 버그가 발생한 곳을 정확히 반영하지 않는다는 것입니다. 당신이 당신의 개체의 ID를 비교하려는 경우 (`탱크 tanks` 단일 값을 처리하려는로

1

당신은 어쨌든 컴파일되지 않습니다 대신 .equals()

doStuff(Tank tanks) { 
    for (int i = 0; i < tanks.length; i++) { 
    if (tanks[i] == this) { 
     continue; 
     } 
    // Do stuff 
    } 
} 
관련 문제