2011-12-14 4 views
3

나는 다음과 같은 정보를 JUnit 테스트 케이스에서이 함수를 호출하고있어 경우 :문 OR 논리 이상한

// abbr = "US"; 
// Countries = array of two objects one with iso2 = "us" 
public Country getCountryFromAbbr(String abbr) { 
    abbr = abbr.toLowerCase(); 
    for (int i = 0; i < Countries.size(); i++) { 
     Country country = Countries.get(i); 
     String iso2 = country.ISO2.toLowerCase(); 
     String iso3 = country.ISO3.toLowerCase(); 

     if (iso2.equals(abbr) || iso3.equals(abbr)) { 
      return country; 
     } 
    } 

    return null; 
} 

내가 디버깅, ISO2iso2.equals(abbr)us의와 두 번째 목적은 사실이고, 다른 하나는 false입니다 . 그러나 국가 반환 된 및 디버거가 루프를 완료하고 null을 반환합니다.

저는 사실로 혼동하고 있습니다. || 거짓이 사실입니다. 내가 놓친 게 있니?

다음은 국가의 모형이다 :

List<Country> Countries = new ArrayList<Country>(); 
    Country country = new Country(); 
    country.CountryId = 1; 
    country.CountryName = "Great Britian"; 
    country.ISO2 = "GB"; 
    country.ISO3 = "GBR"; 
    Countries.add(country); 

    Country usa = new Country(); 
    usa.CountryId = Studio.USA_COUNTRY_ID; 
    usa.CountryName = "United States of America"; 
    usa.ISO2 = "US"; 
    usa.ISO3 = "USA"; 
    Countries.add(usa); 
    return Countries; 


편집 : 내가 사용 이클립스 디버깅을 사용하고 내

2.3.3 X 이드
+0

iso2를 소문자로 변환하면 abbr도 소문자입니까? –

+0

예,'abbr = abbr.toLowerCase()' – Joe

+0

arg가 정확한지 확인하기 위해''.equals (abbr)'을 단정 할 수도 있습니다. –

답변

1

간단한 if 조건으로도 정상적으로 작동합니까?

if (iso2.equals(abbr)) { 
      return country; 
     } 
if(iso3.equals(abbr)){ 
     return country; 
} 
+0

이것은 무슨 일이 일어나고 있는지 파악하는 데 도움이되었습니다. 디버거는'return country'에서 중단 점이 있더라도'return null' 줄로 점프하고있었습니다. 그런 다음'getCountryFromAbbr' 바로 다음의 명령문이 NullPointerExecption을 던지고 있습니다. – Joe

+1

하나의 의견은 다른 대답입니다. –

0

이 열거의 작업처럼 보인다! (! whoooooosh)

public enum Country { 

    GREAT_BRITAIN("GB", "GBR"), 
    USA("US", "USA"); 

    private String iso2; 
    private String iso3; 

    private Country(String iso2, String iso3){ 
     this.iso2 = iso2; 
     this.iso3 = iso3; 
    } 

    public static Country getCountry(String a){ 
     for (Country c : Country.values()){ 
      if (c.iso2.equalsIgnoreCase(a) || c.iso3.equalsIgnoreCase(a)){ 
       return c; 
      } 
     } 
     return null; // no country found! 
    } 

} 

나라가 불변 인 경우

은, 다음이 그 일의 깔끔한 방법입니다 (당신은 내부의 값을 변경하지 않을거야) -뿐만 아니라 속성으로는 ID와 이름을 추가 할 수 있습니다 . 이러한 속성에 액세스해야하는 경우 getter를 노출합니다.

현재 메서드는 메서드의 인수 대신 Countries을 인스턴스 변수로 액세스하므로 거기에 부작용이있을 수 있습니다.

+0

글쎄, 당신은 요점을 가지고 있지 않았을 수도 있습니다. 문제는 그것을하는 방법이 아니라, 그것을 할 수있는 많은 방법이 있습니다. 진짜 질문은 왜 여기서 코드가 작동하지 않는지에 대한 것입니다. –

+0

아니요 - 문제를 이해합니다. 나는 단지'getCountryFromAbbr()'에 대한 작업 대체를 제안했다. _this_ 코드에서 작동하지 않으면 실제 문제는 실제로 다른 곳 (즉, 단위 테스트 코드)에있는 것입니다. –