我是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)
答案 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;
}
在写课时不用担心。