2013-04-28 2 views
1

저는 Java 프로그래밍의 초급자입니다. BlueJ IDE를 사용하고 있습니다. 이 뮤 테이터가 무엇이 잘못되었는지를 파악할 수 없습니다. 오류 메시지에 bad operand types for binary types이 표시됩니다.Mutator Help : 초급 프로그래머

/** 
* Sets the period of this course. 
*/ 
public void setPeriod(String period) 
{ 
    if(period = "A"|| "B" || "C" || "D") 
    { 
     this.period = period; 
    } 
} // end of mutator setPeriod(String period) 

답변

5

if 문이 잘못되었습니다. 별도의 테스트 표현식은 논리적 인 || 연산자로 구분되어야합니다.

또한 String 콘텐츠를 비교하려면 String.equals을 사용하십시오. 할당 연산자 =은 값을 지정하는 데 사용됩니다. 더 나은

if (period.equals("A") || period.equals("B") || 
          period.equals("C") || period.equals("D")) { 

또는

if ("A".equals(period) || "B".equals(period) || 
          "C".equals(period) || "D".equals(period)) { 

NullPointerException에 대해 보호 할 수는 period 기간이 null의 경우 null

+0

대단히 감사합니다. –

3
public void setPeriod(String period) 
{ 
    if(period.equals("A") || period.equals("B") || period.equls("C") || period.equals("D")) 
    { 
     this.period = period; 
    } 
} // end of mutator setPeriod(String period) 

그래서 어떤 일이되어야 하는가? 아니면 그 값 중 하나와 같지 않습니까?

+0

대단히 감사합니다. :) –

4

|| 논리적 또는의 약자 피연산자는 부울 또는 결과 표현 수 있습니다 부울

당신은 같은 부울 표현식을 확인하기 위해 귀하의 방법을 변경해야합니다

public void setPeriod(String period) 
{ 
    if("A".equals(period) || "B".equals(period) || "C".equls(period) || "D".equals(period)) // using "A".equals(period) also gives safety from NPE, if period is null 
    { 
     this.period = period; 
    } 
} 
아래
3

operator precedence table을 문의하십시오. 논리 또는 ||은 할당보다 높은 우선 순위를 갖습니다. =. 또한 C 계열의 언어에서 =이 할당이고 ==은 동등성 테스트임을 인식해야합니다. 그래서, 표현식

if(period = "A"|| "B" || "C" || "D") 

는 "A"또는 "B"또는 "C"또는 "D" 및 결과 true 있는지

if(period = ("A"|| "B" || "C" || "D")) 

세트 기간과 동일한 것을 의미한다. 그러나 논리적이거나 단지 C와는 달리 부울을 사용하기 때문에 표현의 일부가 컴파일되지 않습니다. 그것이 효과가 있다고하더라도, 테스트하는 대신 결과에 기간을 정할 것입니다. 그리고 그 결과는 부울이 아닙니다. 로 테스트를 작성, 그리고

private final Set<String> legalPeriods; 
static { 
    Set<String> set = new HashSet<>(); 
    set.add("A"); 
    set.add("B"); 
    set.add("C"); 
    set.add("D"); 
    legalPeriods = Collections.unmodifiableSet(set); 
} 

: 당신이 필요로하는 무엇

는 세트 멤버를 테스트하는 것입니다

if (legalPeriods.contains(period)) { 
    this.period = period; 
} 

이것은 더 많은 작업이지만, 그것은 아주 잘 자체를 설명합니다. unmodifiableSet에 대한 호출은 재해가 발생하지 않습니다. 나는 나 자신을 보호하려고 노력한다.

0

질문에 대한 직접적인 대답은 아니지만 문제가 발생하지 않도록하고 일반적으로 마침표로 된 문자열 대신 enum을 사용하는 것이 좋습니다. 그럼 당신은 예를 들어, 사용할 수있는 입력 파일에서 구문 분석 문자열에 대한 정적 valueOf() 방법 :

public void setPeriod(String period) throws IllegalArgumentException { 
    this.period = Enum.valueOf(Class<Period>, period); 
} 

아니면 그냥있을 수는 방법은 수 :

public void setPeriod(Period period) { 
    this.period = period; 
} 

하고 기록 할 때 그것에 대해 걱정하지 귀하 수업.