Mutator帮助:初级程序员

时间:2013-04-28 17:39:10

标签: java bluej

我是Java编程的初学者。我正在使用BlueJ IDE。我似乎无法弄清楚这个mutator有什么问题。错误消息显示为bad operand types for binary types

/**
 * 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 个答案:

答案 0 :(得分: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成为period null

答案 1 :(得分:4)

||代表逻辑OR ,其操作数可以是布尔表达式,这会导致布尔值< /强>

您应该更改方法以检查下面的布尔表达式

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;
    }
} 

答案 2 :(得分: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)

那么如果句点为空,会发生什么?或者不等于这些值中的任何一个?

答案 3 :(得分:3)

您需要咨询operator precedence table。逻辑或||的优先级高于赋值=。此外,您需要认识到C系列语言中=是赋值,而==是相等性测试。所以,你的表达

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

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

将句点设置为“A”或“B”或“C”或“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的呼吁是防灾的;我试图保护自己免受自己的伤害。

答案 4 :(得分: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;
}

在写课时不用担心。