1

我是 Java 编程的初学者。我正在使用 BlueJ IDE。我似乎无法弄清楚这个突变器有什么问题。错误消息说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)
4

5 回答 5

6

您的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

于 2013-04-28T17:41:37.183 回答
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;
    }
} 
于 2013-04-28T17:42:37.607 回答
4

您将需要查阅运算符优先级表。逻辑或,||具有比赋值更高的优先级,=。此外,您需要认识到,在C语言家族中,=是赋值,==而是相等测试。所以,你的表情

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

意思是一样的

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

将 period 设置为“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是防灾;我试图保护自己免受自己的伤害。

于 2013-04-28T17:51:54.873 回答
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)

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

于 2013-04-28T17:41:47.170 回答
0

不是对您的问题的直接回答,但如果您使用枚举而不是字符串作为句点,您可以避免这个问题,并且通常会让事情变得更容易。然后,您可以使用静态valueOf()方法从输入文件中解析字符串:

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

或者你可以让你的方法是:

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

编写课程时不要担心。

于 2013-04-29T14:27:03.300 回答