2017-08-09 14 views
1

私はBlueJ IDEを使用してJavaプログラムを作成しています。BlueJでコンパイルエラー - 他の場合returnステートメントで

私はString戻り型のメソッドを持っています。 boolean変数 "flag"がtrueの値を持つ場合、一方の値が返され、falseの場合は別の値が返されるように、return文をif-else内に置いています。

ここで、BlueJはこれ以降も別のreturn文を要求します。

enter image description here

私は、それが動作するかどうか、他の後に別のリターンを与える場合。

どうしてですか?私はreturn文の後に文がないことを知りました。だから、なぜコンパイラは別のreturn文を要求していますか?

誰かがカット・ペーストの目的でコードを望む場合、ここにあります。このコードは、2進数を分数を含む10進数に変換しますが、負の数は変換しません。ここ

public class Conversions{ 
    protected String Binary_Decimal(String str){ 
     int a = str.indexOf('.'); 
     boolean flag = false; 
     if (a == -1){ 
      str += ".0"; 
      a = str.indexOf('.'); 
      flag = true; 
     } 
     String bd = str.substring(0, a); 
     String ad = str.substring(a + 1); 
     a = 0; 
     double num = 0; 
     for (int i = bd.length() - 1; i >= 0; i--){ 
      num += Math.pow(2, a) * Integer.parseInt(Character.toString(str.charAt(i))); 
      a++; 
     } 
     if (flag == true){ 
      return Integer.toString((int) num); 
     } 
     else if (flag == true) { 
      a = -1; 
      for (int i = 0; i < ad.length(); i++){ 
       num += Math.pow(2, a) * Integer.parseInt(Character.toString(str.charAt(i))); 
       a--; 
      } 
      return String.valueOf(num); 
     } 
     return String.valueOf(num); //<-- WHY DOESN'T IT RUN WITHOUT THIS EXTRA return? 
    } 
} 

strは異なる方法Input()を用いてユーザにより入力された文字列です。

+1

テキストを挿入します。画像を引用することはできません。 –

答えて

2

if - elseif - else ifと書いています。コンパイラは、あなたが持っている2つの条件が互いに排他的であるため、すべてのケースをカバーすることを理解しないか、気にしません。どのようにブランチを書いたかを考えると、関数が常にStringを返すことをコンパイラが保証するためには、明示的にelseまたはキャッチオールreturnが必要です。

これは、一連の条件があるときにelseを明示的に綴じるのが悪い考えの1つの例です。より重要な理由は、あなたのifには、はるかに複雑なものが含まれていることが多く、適切に否定しない可能性があるということです。

+0

これでうまくいった。ありがとう。 –

2

なぜ、コンパイラは別のreturn文を要求しているのですか?

デフォルトのreturn文がないためです。

満足している条件がない場合はどうなりますか?何かがデフォルトの権利を返す必要がありますか?それが問題なのです。そのため、その行のコメントを外すとコンパイルされます。

さらに、else文がある場合でも、プログラムは少なくとも1つの満足されたリターンを持ち、コンパイルされます。それを試してみてください。

return文の後にはステートメントが存在しないことがわかっていました。

この文にはいくつかの条件があります。 if文の中にreturn文があります。したがって、式が真でない場合、戻り値が実行される方法はありません。

2

2番目のELSE IF句を削除し、ブロックを最初のreturn文の直後に置き、そのフラグがブール値であると見なします。次のように:

if (flag) return Integer.toString((int) num); 
a=-1; 
for(....){ 
.... 
} 
return String.valueOf(num); 

このように、コンパイラはエラーを通知してはなりません。

+1

コンパイラは、あなたの場合は、すべての可能な条件を満たしているかどうかを知り、他のすべての場合を含む他の "else"を求めます。 – AndreaTaroni86

+0

さらに、最初の戻り値が呼び出しを終了した場合、そのvoidの残りのコードは実行されないので、ELSEは意味がありません。あなたがブール値のフラグをテストしている場合は、特に。フラグが真でない場合はfalseでなければならないので、再度フラグをテストする意味がありません。 – AndreaTaroni86

関連する問題