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これは、あるべきものから保護しperiodますnull

于 2013-04-28T17:41:37.183 に答える
4

演算子の優先順位表を参照してください。論理和||は代入よりも優先され=ます。Cまた、言語のファミリーでは、=が割り当てであり==、が平等テストであることを認識する必要があります。だから、あなたの表現

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

と同じ意味

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

期間を「A」または「B」または「C」または「D」に設定し、結果がtrue. ただし、C とは異なり、logical or はブール値でのみ機能するため、式のその部分はコンパイルされません。それが機能したとしても、結果をテストするのではなく、結果に期間を設定することになります。そして、結果はブール値ではありません。

必要なのは、セット メンバーシップをテストすることです。

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 に答える
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;
    }
} 
于 2013-04-28T17:42:37.607 に答える
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 に答える