2016-06-04 1 views
-3

BonusEmporium의 내 메서드 applyBonus()City 개체의 arrayList에서 보너스 개체를 가져오고 Player 개체에 적용합니다. 나는이처럼 내 함수를 작성할 때 내가 아무 문제를 테스트가 없습니다 :배열 요소가 비어 있는지 확인

public class BonusEmporium extends Bonus { 
    public BonusEmporium(int cities) { 
     this.setBonusType(BonusType.EMPORIUM); 
     this.cities=cities; 
     setCity(new ArrayList<City>(cities)); 
    } 
    public void applyBonus(Player player){ 
     Bonus bonus=getCity().get(0).getBonus().get(0);//gets the first bonus from the first 
                 //city 
     bonus.applyBonus(player); 
     Bonus bonus=getCity().get(0).getBonus().get(1);//gets the second bonus from the first 
                 //city 
     bonus.applyBonus(player); 
     Bonus bonus=getCity().get(1).getBonus().get(0);//gets the first bonus from the 
                 //second city 
     bonus.applyBonus(player); 
    } 

} 

내가 arraylists 내가 배열에서 요소가 비어 있는지 확인 어떻게, 요소를 포함하는 동안 만 실행 할 때 문제가 ?

public class BonusEmporium extends Bonus { 
    public BonusEmporium(int cities) { 
     this.setBonusType(BonusType.EMPORIUM); 
     this.cities=cities; 
     setCity(new ArrayList<City>(cities)); 
    } 
    public void applyBonus(Player player){ 
     int i=0,j=0; 

      while(j<cities){ 
       while(getCity().get(j).getBonus().get(i)!=null){//In theory this should 
//verify that the element bonus i from the city j is not empty 
//but i get NullPointerException 
        Bonus bonus=getCity().get(j).getBonus().get(i); 
        bonus.applyBonus(player); 
        i++; 
       } 
       j++; 
     } 

    } 

} 
+0

확인하지 않고 괜찮을에 널 (null)을 넣지 마십시오 루프 (크기를 지정하지) 생성자의 모든 ArrayLists을 초기화하기 null이 비어 있지 않다는 의미입니다. –

+0

null (NULL 이외의 null)을 의미 할 수 있습니다. null은 null이 아니지만 더 철학적 인 수준 일 수 있습니다. –

+0

@PavelNiedoba null은 할당되지 않았거나 참조되지 않았 음을 의미합니다. List 객체 자체가 null이 아니면 길이가 0입니다. –

답변

2

는 어렵다 당신이 물어보고있는 것을 말하지만, message chain을 더 잘 처리하면 오류를 피할 수 있습니다. 일반적으로

public void applyBonus(Player player){ 
    List<City> cities = getCity(); 
    for(int i = 0; cities != null && i < cities.size(); i++){ 
     City c = cities.get(i); 
     List<Bonus> bonuses = c.getBonus(); 
     for (int j = 0; bonuses != null && j < bonuses.size(); j++) { 
      Bonus b = bonuses.get(j); 
      if (b != null) 
       b.applyBonus(player); 
     } 
    } 
} 
+0

컴파일 오류가 발생합니다. 형식 목록이 일반이 아니며 인수를 사용하여 매개 변수화 할 수 없습니다.

+0

이제 util 대신 awt를 가져 왔습니다. 고맙습니다. –

+0

다행스럽게도 알아 냈습니다. 나는 ArrayList를 사용했을 것이다. 그러나 더 타이핑하는 것이었다. –

1

요소가이 같은 비어있는 경우 체크인 : 전체 배열이 비어있는 경우

if(array != null && array.get(index) == null) // element is null when empty 

확인하려면 (에 요소가없는) :

if(array != null && array.isEmpty()) 
+0

그것이 비어 있지 않다는 것을 확인하기 위해 그것이 내가 쓴 이유입니다!= null이 당신이 –

+0

에 .. 빈 빈 여부는 이미 인스턴스화 것을 의미한다 . –

+0

빈은'배열 == null'이 의미하는 경우가 인스턴스화 아니에요 있습니다 @marcosguerra 아니다 확인하려는 경우 물론 검사를 반전 할 수 @marcosguerra –

0

는 자바의 문제는 다음과 같이 게터 체인된다

getCity().get(j).getBonus().get(i)!=null 

현재 4 곳에서 nullpointer 예외를 얻을 수 있습니다. 당신은 그들에게 모든 등을 확인할 수 있습니다

if (getCity()!=null && 
    getCity().get(j) && 
    getCity().get(j).getBonus() && 
    getCity().get(j).getBonus().get(i)!=null){ 
.... 
} 

다른 방법은 전체 시도의 코드를 캡슐화 할 수 - 더 해킹처럼 캐치 잡기 NPE를.

또한 foreach는 대신 잠시 사용하는 것이 좋습니다 당신은 항상

myArr.getSize() 

사용하여 얻을 또한 ArrayList의 생성자에 대한 자바 독을 확인할 수 있기 때문에, 별도의 변수에 배열의 크기를 저장하지 않는 :

new ArrayList<City>(cities) 

이것은 예상 한대로 수행하지 않을 가능성이 높기 때문에

단편 :

사용 foreach 문이

가 배열

당신이 빈 요소

+0

'int cities'는 보너스가 얼마나 많은 도시를 알려주기 때문에 그 배열의 크기를 지정해야한다. 플레이어는 그가 원하는 모든 도시를 선택할 수 있습니다. –

+0

@marcosguerra 매개 변수로 크기를 지정하면 ** 해당 크기의 배열을 미리 초기화합니다 ** ** 해당 요소 수 이상을 추가하지 못합니다 ** –