也许我的问题很愚蠢,但我无法解决。
这是我的代码:
public Velocity add(final Velocity velocity)
{
Velocity vel;
if(velocity.getClass().equals(CartesianCoordinate(x, y)))
{
double sumX = x + velocity.x;
double sumY = y + velocity.y;
Velocity v = new Velocity(CartesianCoordinate(x,y));
v.x = sumX;
v.y = sumY;
vel = v;
}
if(velocity.getClass().equals(p))
{
do something...
}
return vel;
}
任何人都可以告诉我为什么我不能返回“vel”,我不想创建一个类变量......
答案 0 :(得分:2)
任何人都可以告诉我为什么我不能返回“vel”
当然 - 如果你的条件都没有,你还没有给它一个值。变量不是明确分配,因此您无法读取其值以返回它。在这种情况下,你想要返回什么?它甚至有效吗?也许你应该在这种情况下抛出异常。
我个人实际上会从每个if
块返回 - 我认为局部变量不会增加任何好处。那时,更明显的是错误:
public Velocity add(final Velocity velocity) {
if (...) {
...
return ...;
}
if (...) {
...
return ...;
}
// What should we do if we get here?
}
既然做的两个条件确定了返回值只是立即返回它,那么更明显(IMO)如果你到达底部,那是因为这两个条件都没有被评估为true
...所以要么返回一些“空”值,要么返回空引用,或者抛出异常。
当然,假设您不希望第二个条件有效地胜过第一个条件,它现在也是如此 - 如果两个条件都为真,那么第一个区块中设置的值可能是无关紧要的,因为它'将被第二个区块覆盖。
还不清楚CartesianCoordinate
做了什么,但奇怪地命名为Java方法 - 如果它返回Class<?>
那肯定很奇怪。这里的p
是什么?我不知道你的真实代码是否与此有些不同,但即使除了不能编译的原因外,它对我来说也有些腥味。
答案 1 :(得分:1)
局部变量没有默认值,应该初始化。
如果val
是实例字段或静态字段并且未初始化,则在访问时它将返回默认值。
答案 2 :(得分:0)
您只能返回带有值的变量。因此,val
没有一个可能的情况。
解决此问题的简便方法是直接在声明上初始化val
:
Velocity vel = null; //or
Velocity vel = new Velocity();
或者您需要在else
语句中添加if
分支,其中vel
也已初始化。
if(velocity.getClass().equals(CartesianCoordinate(x, y)))
{
double sumX = x + velocity.x;
double sumY = y + velocity.y;
Velocity v = new Velocity(CartesianCoordinate(x,y));
v.x = sumX;
v.y = sumY;
vel = v;
}else{
vel = null;//or
vel = new Velocity();
}