Java错误“缺少返回语句”

时间:2016-09-06 03:06:09

标签: java return-value

所以这是我的代码:

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之外添加一个简单的返回值,它将起作用,但我不明白为什么会出现这种情况。

另外,我想在main中添加一个打印“i”语句,但只要我这样做:

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

我尝试添加一个System.out.println(i),它给我一个关于静态变量的错误。

3 个答案:

答案 0 :(得分:2)

  

问题1

您必须在方法中添加return;语句,因为它可能永远不会输入if语句。编译器不知道您将调用该方法的变量:

返回某些内容;

你也错过了一个支架

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

如果你想使用最后的else作为返回点,那么你的方法必须是这样的:

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;
        }
}
  

问题2

如果静态方法超出方法范围,则不允许使用非静态方法。这导致静态方法的加载速度更快,非静态的简单方法和变量可能尚未初始化。

我的意思是:(不允许)

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

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

 }

答案 1 :(得分:2)

你的代码毫无意义,如发布的那样。您有一个带有三个分支的if/else语句。如果n%2为0,则执行第一个分支。如果n%2不为零,则执行第二个分支。由于这涵盖了所有可能性,第三个分支什么时候应该被执行?

因为这没有意义(并且因为之前我已经看过这个编码问题),我怀疑如果第一个if为假,你意味着要执行第三个分支,即如果n <= 1。但由于花括号,编译器会附加&#34; else&#34;到if (n%2...)分支,而不是if (n > 1)。要解决这个问题,你需要另一个大括号:

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;
    }
}

但这仍然不合法,原因并不明显。这里发生的是Java要求您在每个可能的路径中都有return语句。以下是编译器的想法:如果n > 1,那么您有一个if语句if (n%2 == 0)。如果失败,则转到if语句if (n%2 != 0)。如果这也是假的,那么它将下降到最后else部分之后,它将到达方法的末尾而不返回任何内容。

当然,你和我会看着它并说,这是不可能的,因为n%2 == 0n%2 != 0必须是真的。但这需要我们做一些推理。 Java编译器不做这种推理,所以它不能告诉那两个if表达式中的一个必须是真的。

所以解决这个问题也需要你改变

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

        } else {

无论如何你都不需要if - 它完全是多余的。如果我们到达此处,我们就已经知道n%2 != 0

答案 2 :(得分: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;
            }
    }

错误缺少返回语句是因为如果n小于1,则不指定return语句。那么,如果提供的参数 n 小于1就像0.您应该在else语句中指定它,或者甚至在函数的最后一行使用单个return语句,如 return -1 ;