下面是用于测试目的的简单代码。
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()进行静态引用编辑最后一次:我恨这个补丁,因为它似乎正确的我,但月食似乎认为,即使它不是静态的使用使每一个静态变量修复它(它没有)
。答案 0 :(得分:3)
boolean isMoving(){
if (a == b) {
return true;
} else if (a != b) {
return false;
}
}
这里的编译器没有检测到这两个分支中的一个必须被命中,因此它认为有一种可能的状态,你可以在没有指定返回的情况下到达方法的末尾值。您可以使用else
代替else if
或return a == b
。
这不仅仅是编译器的缺陷;您可能有一个场景,其他线程正在后台更改a
和b
的值,并且根据时间,这两个条件在评估时可能都是错误的。
答案 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
语句是互补的?毕竟,另一个线程(理论上)可能不会改变a
或b
的值?那么你可能会遇到一个没有返回值的情况。
只需提供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++;
}
相反,它能解决您的问题吗?如果是,那么你有两个具有相同名称的变量,你不应该这样做。