Java错误“;“缺少返回状态”;

Java错误“;“缺少返回状态”;,java,return-value,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) {

这是我的代码:

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

此外,我想在main中添加一个print“I”语句,但每当我执行以下操作时:

if (something){
   int i;
   i++;
   do something
我尝试添加一个System.out.println(I),它给出了一个关于静态变量的错误

问题1

您必须添加
返回语句导致它可能永远不会输入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

如果静态方法超出方法作用域,则不允许将非静态变量用于静态方法。这是因为静态方法的加载速度比简单的非静态方法和变量可能尚未初始化的速度更快

我的意思是:(不允许)


你的代码毫无意义,就像贴出来的一样。您有一个带有三个分支的
if/else
语句。如果
n%2
为0,则执行第一个分支。如果
n%2
不是零,则执行第二个分支。既然这涵盖了所有的可能性,那么第三个分支应该什么时候执行

因为这没有意义(因为我以前见过这个编码问题),我怀疑您的意思是,如果第一个
if
为false,即如果
n1)
则执行第三个分支。要解决此问题,您需要另一个花括号:

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==0
要么
n%2!=0
必须为真。但这需要我们做一些推理。Java编译器不会进行这种推理,因此它无法判断这两个
if
表达式中的一个必须为真

因此,解决这一问题还需要进行更改

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

无论如何,你不需要
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;
            }
    }

缺少返回语句的错误是因为如果n小于1,则未指定返回语句。。因此,如果提供的参数n小于1(如0),该函数将返回什么。您应该在else语句中指定它,甚至在函数的最后一行使用单返回语句,如return-1

您缺少一个结束括号。如果
n
为0,您将返回什么?@Andreas代码甚至不会走那么远。@TimBiegeleisen我找不到一个开放括号。也许是因为我只使用了一个简单的文本编辑器,但我觉得一切都很简单。@TimBiegeleisen不明白你的评论。“缺少大括号”和“缺少返回”都是编译器错误,所以代码在这两种情况下都不会出现任何错误。哦,我明白了,我错过了。是否仍然可以让方法仅返回print语句,或者除了放置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;
            }
    }