2013-04-28 3 views
1

Я начинаю программировать на Java. Я использую BlueJ IDE. Я не могу понять, что случилось с этим мутатором. В сообщении об ошибке указано bad operand types for binary types.Mutator Help: Beginner Programmer

/** 
* 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.equals для сравнения String. Оператор присваивания = используется для присвоения значений.

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 должен быть periodnull

+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") 

означает то же самое, как

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

установленного периода до «А» или «В» или «С» или «D» и посмотреть, если результат равен true. Но логично или работает только с булевыми, в отличие от 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; 
} 

и не беспокоиться об этом при написании класс.