2016-09-06 5 views
-2

だからここに私のコードです:私はエラーがどこにあるか見つけることができないようJavaエラー「リ​​ターンなステートメントを逃す」

public class Bob { 

    public static int F(int n) { 
     if (n > 1) { 
      if (n % 2 == 0) { 
       n = n/2; 
       System.out.println(n); 
       return F(n); 
      } else if (n % 2 != 0) { 
       n = 3 * n + 1; 
       System.out.println(n); 
       return F(n); 
      } else { 
       System.out.println("Complete"); 
       return 0; 
      } 
    } 


    public static void main(String[] args) { 
     int result = F(10); 
     System.out.println(result); 
    } 
} 

。可能なすべてのnの値がカバーされます。私がif-statmentの外で単純な戻り値を加えると、それはうまくいくが、なぜそうでなければならないのか分からない。

また、私がメインに印刷 "i" のステートメントを追加したいのですが、私はのような何かやるたび:

if (something){ 
    int i; 
    i++; 
    do something 

を私がするSystem.out.println(i)と、それを追加しよう私は静的変数についてのエラーを返します。あなたはそれがif statement.Theコンパイラは、そのようにメソッドを呼び出しますどのような変数を知らない決して入らないことが原因の方法でreturn;ステートメントを追加する必要が

+0

閉じ括弧がありません。 –

+0

'n'が0の場合、あなたは何を返そうとしていますか? – Andreas

+0

@Andreasコードはそれほど遠くには達しません。 –

答えて

2

はあなたのコードでは、意味がありません。 3つのブランチを持つif/elseステートメントがあります。 n%2が0の場合、最初のブランチが実行されます。n%2がゼロでない場合、2番目のブランチが実行されます。それはすべての可能性をカバーしているので、3番目のブランチはいつ実行されるのですか?

これは当てはまりません(前にこのコーディングの問題を見たことがあるため)、最初のifが偽(つまり、n <= 1)の場合に3番目の分岐が実行されることを意味すると思われます。しかし、中括弧のために、コンパイラはif (n > 1)ではなく、if (n%2...)ブランチに "else"を割り当てます。これを修正するには、別のカーリーブレースが必要です

public static int F(int n){ 
    if (n > 1){    // ***** Opening brace 1 
     if (n%2 == 0){ 
      n = n/2; 
      System.out.println(n); 
      return F(n); 
     } else if(n%2 != 0){ // ***** Opening brace 2 
      n = 3*n+1; 
      System.out.println(n); 
      return F(n); 
     }   // This curly brace matches "opening brace 2" 
    }    // This curly brace matches "opening brace 1" 
    else { 
     System.out.println("Complete"); 
     return 0; 
    } 
} 

をしかし、それはまだ有効ではありません、その理由は明らかではありません。ここでは、可能な限りすべてのパスにreturnステートメントが必要です。そして、ここでコンパイラが考えるものです:n > 1場合は、if声明if (n%2 == 0)を持っています。これが失敗すると、ifステートメントif (n%2 != 0)に行きます。これも偽であれば、最後のelse部分を過ぎてドロップされ、何も返さずにメソッドの最後に到達します。

n%2 == 0またはn%2 != 0のいずれかが真でなければならないので、あなたと私はそれを見て、それは不可能だと言います。しかし、それは我々が何らかの推論をすることを必要とする。 Javaコンパイラはそのような推論をしないので、2つの式のうちの1つが真でなければならないとは言えません。それは完全に冗長だ - だから、これを固定

はまた、あなたがあなたがとにかくifを必要としない

 } else { 

 } else if(n%2 != 0) { 

を変更する必要があります。ここに来たら、すでにn%2 != 0を知っています。

2

質問1

返品

public static int F(int n) { 
     if (n > 1) { 
      if (n % 2 == 0) { 
       n = n/2; 
       System.out.println(n); 
       return F(n); 
      } else if (n % 2 != 0) { 
       n = 3 * n + 1; 
       System.out.println(n); 
       return F(n); 
      } 
     } else { 
      System.out.println("Complete"); 
      return 0; 
     } 
} 

質問:あなたはリターンポイントとして他に、最終的に使用したいの代わり場合

はまた、あなたがここに

else{ System.out.println("Complete"); return 0;} 

ブラケットを逃し、あなたの方法は次のようにする必要があり静的メトに非静的変数を使用して2

メソッドスコープから外れている場合、dsは許可されません。これは、静的メソッドがより高速にロードされ、静的でない単純メソッドと変数がまだ初期化されていない可能性があるためです。私が何を意味するか

:投稿として(許可されていないが)

int b; 
public static void main (String[ ] args){ 

    // variable (b) has to be static to be used here 

} 
+1

ああ、私はそれを逃した参照してください。 printステートメントだけを返すメソッドを取得する方法はありますか、またはダミー出力0を置く以外の方法がありますか? – Astrum

0
public static int F(int n) { 
     if (n > 1) { 
      if (n % 2 == 0) { 
       n = n/2; 
       System.out.println(n); 
       return F(n); 
      } else if (n % 2 != 0) { 
       n = 3 * n + 1; 
       System.out.println(n); 
       return F(n); 
      } else { 
       System.out.println("Complete"); 
       return 0; 
      } 
    } 

エラー不足しているreturn文このfucntionリターンを提供パラメータNが1未満のようであればどのような、nが1未満である場合は、return文を指定していないので...ですので、 0を指定する必要があります。elseステートメントで指定するか、または関数の最後の行にの戻り値-1などの単一のreturn文を指定する必要があります。

関連する問題