2

Critter プログラムに、攻撃の種類を 4 つのオプションからランダムに選択するように指示しようとしています。return ステートメントのベースがカバーされていると思っていましたが、drjava から「return ステートメントがありません」というエラーが表示されます。

public Attack fight(String opponent) {
   int fightChoice = new Random().nextInt(4); 

   if(fightChoice == 0){
     return Attack.ROAR;
   } if(fightChoice == 1){
     return Attack.POUNCE;
   } if(fightChoice == 2){
     return Attack.SCRATCH;
   } if(fightChoice == 3){
     return Attack.FORFEIT;
   }
 }

それはなぜでしょうか?

4

6 に答える 6

3

基本的に、コンパイラは、4 つのステートメントですべての可能性をカバーしたことを理解できるほどスマートifではありません ( の戻り値のコントラクトについて実際には認識していませんRandom.nextInt())。

returnしたがって、 final の後にダミーを追加する必要がありますif。それは事実上デッドコードなので、そこに何を返すかは問題ではありません。ただし、何らかの未使用または明らかに無効な値を返すのは良いスタイルです。

編集: よく考えてみると、ダミーの値を返すのではなく、無条件に何らかの「プログラマ エラー」例外をスローする方がよいでしょう。

于 2012-12-01T19:54:47.797 に答える
1

if ステートメントの外側に欠落しているステートメントが必要です。たとえば、 ifの場合flightChoice == 4、どの条件も成立しないため、メソッドの最後にifa を追加する必要があります。returnこの return ステートメントは、分岐のAttackような型のものを返す必要があります。if

于 2012-12-01T19:53:18.757 に答える
1

if ステートメントは考えられるすべてのケースをカバーしていると思うかもしれませんが、コンパイラはコードをコンパイルするだけで、可能性をカバー/計算しません。return最後のif-statementの後にステートメントを追加する必要があります。

于 2012-12-01T19:54:10.327 に答える
1

考えてみてif conditionくださいtrue。その場合、そのメソッドからは何も返されません。

メソッドがたどることができるすべてのパスから戻る必要があります。そうしないと、missing returnステートメント エラーが発生します。

  • if'sanif-else ifブロックを作成elseし、最後に an を追加して、そこから何らかの値を返すことができます。
  • または、メソッドの最後に単に return ステートメントを追加することもできます。
于 2012-12-01T19:54:24.990 に答える
0

どのステートメントも真ではreturnない場合に備えて、ステートメントが必要です。if

于 2012-12-01T19:54:38.423 に答える
0

上記/前の回答は、「いいえ」が真のreturn場合に備えて、最後にステートメントが必要であることを説明しています。ifこの場合の良い習慣 (おそらく最善ではない) として、提案を追加したいだけです: 最後にのみ結果を返し、返された結果の値をそれぞれに割り当てます(より効率的にするためにifいくつかの s を追加することもできます)。elseこの場合)。

于 2012-12-01T20:04:28.503 に答える