两件事:Eclipse说“一定是静态的”!并且此方法必须返回boolean类型的结果,而它返回true

时间:2011-10-31 20:44:09

标签: java return-value static-members

下面是用于测试目的的简单代码。

boolean isMoving(){
    if (a == b) {
        return true;
    } else if (a != b) {
        return false;
    }
}

我收到错误:

  

此方法必须返回boolean类型的结果

虽然在任何给定时间它必须返回true或false,并且永远不返回两者。也, 无论我在做什么,Eclipse告诉我

  

无法对非静态字段bikeSpeed进行静态引用

void speedUp(){
    bikeSpeed++;
}

bikeSpeed

int bikeSpeed = 2;

可能简单的答案,但任何人都可以帮忙吗?我知道如何使用布尔和这样的,和从未有过问题,但最简单的事情^^^是行不通的。

编辑:继续我的速度:

void speedUp(){
    bikeSpeed++;
}

继续使用它:

    System.out.println("Simple if && if-then-else testing.");
    if (isMoving == true) {
        System.err.println("You're already moving fast, no need to speed up!");
    } else {
        speedUp();
        System.out.println("Time to speed up!");
    }

再次编辑:isMoving声明现在很好,但行         if(isMoving == true){ 给出错误:isMoving无法解析为变量。如果我将它切换到那个,那么isMoving()也是如此。 最后一个错误是

加速();

给出:不能从类型HelloWorld

中对非静态方法speedUp()进行静态引用

编辑最后一次:我恨这个补丁,因为它似乎正确的我,但月食似乎认为,即使它不是静态的使用使每一个静态变量修复它(它没有)

8 个答案:

答案 0 :(得分:3)

boolean isMoving(){
    if (a == b) {
        return true;
    } else if (a != b) {
        return false;
    }
}

这里的编译器没有检测到这两个分支中的一个必须被命中,因此它认为有一种可能的状态,你可以在没有指定返回的情况下到达方法的末尾值。您可以使用else代替else ifreturn a == b

这不仅仅是编译器的缺陷;您可能有一个场景,其他线程正在后台更改ab的值,并且根据时间,这两个条件在评估时可能都是错误的。

答案 1 :(得分:3)

这相当于:

boolean isMoving(){
    return a == b;
}

Eclipse抱怨,因为它认为并非所有执行路径都是可处理的。尝试:

boolean isMoving(){
    if (a == b) {
        return true;
    } else if (a != b) {
        return false;
    } else {
        return //a is neither equal nor not equal to b???
    }
}

请注意,最后一个分支实际上永远不会发生,因为如果不满足a == b条件,则a != b 必须为真。

答案 2 :(得分:2)

对于此代码:

boolean isMoving(){
    if (a == b) {
        return true;
    } else if (a != b) {
        return false;
    }
}

编译器如何可靠地推断出您的if语句是互补的?毕竟,另一个线程(理论上)可能不会改变ab的值?那么你可能会遇到一个没有返回值的情况。

只需提供else(在这种情况下,请使用而不是else if):

boolean isMoving(){
    if (a == b) {
        return true;
    } else {
        return false;
    }
}

您还可以依赖第一个return将阻止其余代码执行的事实:

boolean isMoving(){
    if (a == b) {
        return true;
    }

    return false;
}

答案 3 :(得分:1)

您可以执行的第一个代码段

boolean isMoving(){
    if (a == b) {
        return true;
    } else {
        return false;
    }
}

甚至

boolean isMoving(){
    return a == b;
}

在原始代码中,java编译器无法确定是否输入了条件,因此当它无法在最后找到返回时出错

你也可以在最后添加assert false;throw new RuntimeException();但在这种情况下这是不必要的

答案 4 :(得分:1)

您可以将代码简化为

return a == b

但它抱怨的原因是你的代码相当于

boolean isMoving(){
    if (a == b) {
        return true;
    } else if (a != b) {
        return false;
    } else {
        //oh no, nothing there!
    }
}

静态引用意味着您从某个没有该类实例的地方访问类字段。您可以从main方法访问该字段,这是静态的,而不使用该类的实例。

答案 5 :(得分:0)

第一个问题有点烦人(但有一个原因 - 多线程),java编译器发现不是所有的基础都被覆盖了,修复:

boolean isMoving(){
    if (a == b) {
        return true;
    }

    return false;
}

在第二个你需要引用该对象:

void speedUp(){
    this.bikeSpeed++;
}

编辑: 添加了多线程信息。

看看你所拥有的静态问题是在代码的主要块中,因为main方法是静态的,你不能引用对象变量,你需要首先创建对象的实例然后引用该对象的变量。

答案 6 :(得分:0)

是的,有一种情况是编译器无法告诉你永远不会到达块的末尾。 或者你可以把一个返回假;在闭幕式之前。

答案 7 :(得分:0)

对于您的第一个问题,请按以下步骤更改您的代码:

return a == b;

对于您的第二个问题,您的代码中是否存在名称冲突?如果您使用:

void speedUp(){
    this.bikeSpeed++;
}

相反,它能解决您的问题吗?如果是,那么你有两个具有相同名称的变量,你不应该这样做。