Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

メソッドで返し値を正しく指定しているはずなのに…

当方eclipseを使っています。
返し値は正しく返せていると思うのですが、
エラーメッセージが
"This method must return a result of type boolean"
と出てしまいます。
("equals(LineSegment line)"に下線が引いてある。)

メソッドの動作としては
自身のフィールドと引数のフィールドを比較して
属性が同じであれば true 異なるなら false を返します。(比べる双方のオブジェクトはif文で場合わけする。)

いくつかググッたんですがわからず、どこを疑えばいいのかもわからなくなりました。

よければヒントの方よろしくお願いします。(;人;)



    public boolean equals(LineSegment line){
        if(this.p1.x==line.p1.x||this.p1.y==line.p1.y||this.p2.x==line.p2.x||this.p2.y==line.p2.y){
            if(line instanceof ThickLineSegment == true || this instanceof ThickLineSegment == true){
                if(((ThickLineSegment)line).width == ((ThickLineSegment)this).width)return true; 
            }
            else if(line instanceof DotedLineSegment == true || this instanceof DotedLineSegment == true){
                if(((DotedLineSegment)line).interval == ((DotedLineSegment)this).interval)return true;
            }
            else return true;
        }
        else return false;
    }

9

回答

8028

閲覧

9件の回答

評価

0

括弧無しと括弧有りが混じってると見にくいぞ。
括弧有りに統一しろ。
そもそも括弧無しなんか、使わなくていい。(を

とりあえずヒント。
このコードでは、
1.trueの場合またはfalseの場合何を返すか(else有り)
2.trueの場合何を返すか
が記述されている。
さて、2.でfalseの場合、何を返す?

評価

0

ちょっと修正
誤)(else有り)
正)(else節で終わっている場合。※else ifじゃねえぞ)

評価

0

不良社員さん回答ありがとうございます!

ヒントは最初のif文のことを表していて、
つまり最後のelseが機能していないということですね。

最後のelseを書かなくても同じ動作をすることには気づきました。でもコンパイラに引っかかるということは必要のないものは書くなということなのでしょうか?
またelseを書いていけない理由というのはあるのでしょうか?

評価

0

そんな文章書いてるか?
どこをどう読めば、elseがいらん、なんて読めるんだ。orz

>さて、2.でfalseの場合、何を返す?

これに対する回答は?
仕方がない。書いてあげよう。

A.何も返さない。

これが、コンパイルエラーになる理由だ。

評価

0

自分がどう解釈したかというと
1.trueの場合またはfalseの場合何を返すか
に対して自分は「何を返すかってtrueかfalseしかないよなぁ…?ああこれは最初のif文の中身のことを言っているのだな。」(elseで終わっている場合とあるがそれなら falseを返すのだし…)と考え2.以降で、falseの場合(←最初のif文がfalseの場合)、何をかえす?の問いかけに最後のelseが機能していない(値を返せていない)と判断したためif文の作り方が正しく理解できていないのかと思いなんとなくelseを消してみたらエラーがなくなった…。
そうかelseは書いてはいけないのか。という考えに至り
でもなんでelseがあっちゃいけないんだ?
と疑問に思って再度質問させてもらいました。


<<A.何も返さない。
なにも返さない場合があるからコンパイルエラー
になるということですね!
でもなぜ最後のelse文で値が返されないのかがわからないので改めてif文の動作を動かして確かめてみたいと思います。
時間の方ありましたらまた助言のほうよろしくお願いします。(m。_。)m

評価

0

>に対して自分は「何を返すかって

長々と書いてあるが、
意味不明なので、論評の価値無し。

それにしても、「最初のif」しか出てこないのな。
んなもん、問題にしておらんよ。

これで3度目だ。
もちっとわかりやすく書くか。

Q1.ifをいくつ書いてる?
Q2.ifが入れ子になっているのは理解しているんだろうな。
Q3.elseで終わっていないifは、いくつある?
Q4.elseで終わっていないifは、falseの場合、どんな値を返す?

うち、ひとつはすでに指摘の通りだ。

A4.何も返さない。ので、コンパイルエラーになる。

評価

0

うちも昔同じようなことで悩んだことありますよ。
では、少し簡単な例を出してみたいと思います。

public boolean equals(int num){
    if(num == 5){
        return true;// numが5ならば、返り値はtrueでequalsメソッドを抜ける
    }
// numが5でない場合、この最後の行まで処理が進むけど「最終的に返り値っていくつなの?」ということになりますね
}

そういう場合は

public boolean equals(int num){
    if(num == 5){
        return true;// numが5ならば、返り値はtrueでequalsメソッドを抜ける
    }else{
        return false;// numが5でなければ、返り値はfalseでequalsメソッドを抜ける
    }
}

これならば、返り値が未定になることはないですね。

例のequalsメソッドには「num」(引数)を与えて、「numが5であるか?」(返り値)を確かめるという仕事があります。
numを与えたのに結果(返り値)がないとなると、困りますね。
逆に言えば、あらゆる場合でも、結果(返り値)を返さないといけないのです。

kageさんのソースでは
if(((ThickLineSegment)line).width == ((ThickLineSegment)this).width)

if(((DotedLineSegment)line).interval == ((DotedLineSegment)this).interval)
のif文に対して、elseがありません。
もしも、このif文の条件を満たさない(else)場合は「返り値がなし」ということになります。

評価

0

ちゃんと見てないけど、おそらくポイントは不良社員氏のこれだな。

>括弧無しと括弧有りが混じってると見にくいぞ。
>括弧有りに統一しろ。

Eclipseを使ってるなら括弧ありへの修正途中で分かるかも知れない
し、ctrl + shift + fが分かりやすいかもね。
私は場所に応じて使い分ける人間だが、ネストがある場合は基本的に
は混在させない。
ミスをした場所が分かりづらいから。

評価

0

それと、ifを書くときに、elseであっさりとreturnしまうなら、条件を
逆にしてelseを無くしてしまうほうがシンプルで間違いにくい。
とくに異常正常の判断をする場合は、先に異常な引数を弾いてしまう
ほうがいい場合も多い。

if(a==1){
...
...
...
return 1;
}else{
return 2;
}

if(a!=1)return 2;
...
...
...
return 1;

厳格な決まりがないなら、そういうことも考えてみよう。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。