0

也许我的问题很愚蠢,但我无法解决。

这是我的代码:

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”,我不想创建一个类变量......

4

3 回答 3

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 方法命名 - 如果它返回 aClass<?>那肯定很奇怪。这是什么p?我不知道您的真实代码是否与此有些不同,但即使除了无法编译的原因之外,它对我来说也很腥。

于 2013-03-23T20:10:40.297 回答
1

局部变量没有默认值,应该被初始化。

如果val是实例字段或静态字段且未初始化,则在访问时将返回默认值。

于 2013-03-23T20:10:49.963 回答
0

您只能返回带有值的变量。所以有一种情况可能val没有。

解决这个问题的简单方法是val直接在声明上初始化:

Velocity vel = null; //or
Velocity vel = new Velocity();

或者您需要在您的语句中添加一个else分支,其中也已初始化。ifvel

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();
}
于 2013-03-23T20:15:43.283 回答