Java 错误 "missing return statment"

Java error "missing return statment"

所以这是我的代码:

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 语句之外添加一个简单的 return 值,它将起作用,但我不明白为什么会这样。

另外,我想在 main 中添加一个 print "i" 语句,但是每当我做类似的事情时:

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

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

Question 1

您必须在方法中添加 return; 语句,因为它可能永远不会进入 if statement.The 编译器不知道您将使用哪些变量调用该方法,因此:

return某事;

你还漏了一个括号

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

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

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

Question 2

不允许在静态方法中使用非静态变量,如果它们超出方法 scope.That 是因为静态方法加载速度更快,非静态的简单方法和变量可能尚未初始化。

我的意思是:(不允许)

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

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

 }

您的代码没有意义,正如所发布的那样。您有一个包含三个分支的 if/else 语句。如果 n%2 为 0,则执行第一个分支。如果 n%2 不为零,则执行第二个分支。既然涵盖了所有的可能性,那么第三个分支应该什么时候执行呢?

因为这没有意义(而且因为我以前见过这个编码问题),我怀疑你的意思是如果第一个 if 为假,则执行第三个分支,即如果 n <= 1。但是由于大括号,编译器将 "else" 附加到 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)。如果这也是 false,那么它将下降到最后的 else 部分,并且它将到达方法的末尾而不返回任何内容。

当然,你我看着它会说,那是不可能的,因为n%2 == 0n%2 != 0必须为真。但这需要我们做一些推理。 Java 编译器不进行这种推理,因此无法确定这两个 if 表达式中的一个一定为真。

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

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

        } else {

无论如何您都不需要 if——它完全是多余的。如果我们到达这里,我们已经知道 n%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;
            }
    }

错误 missing return statement 是因为你没有指定 return statement if n is less than 1.. 那么,这个函数 return 如果提供的 参数 n 小于 1,如 0。您应该在 else 语句中指定它,甚至用单个 return 语句如 return -1 在函数的最后一行;