Can';t返回java方法内部的值

Can';t返回java方法内部的值,java,Java,也许我的问题很愚蠢,但我解决不了 这是我的密码: 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

也许我的问题很愚蠢,但我解决不了

这是我的密码:

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

有人能告诉我为什么我不能返回“vel”吗

当然-如果两个条件都不是真的,那么你没有给它一个值。变量没有明确赋值,因此无法读取其值以返回它。如果那样的话,你想退货什么?它甚至有效吗?在这种情况下,也许您应该抛出一个异常

就个人而言,我实际上会从每个
if
块返回-我不认为局部变量会增加任何好处。在这一点上,问题将更加明显:

public Velocity add(final Velocity velocity) {
    if (...) {
        ...
        return ...;
    }
    if (...) {
        ...
        return ...;
    }
    // What should we do if we get here?
}
现在,确定返回值的两个条件都只是立即返回,更明显的是(IMO),如果你到达底部,那是因为这两个条件都没有计算为
true
。。。因此,要么返回一些“空”值,要么返回空引用,要么抛出异常

当然,这是假设您不希望第二个条件有效地胜过第一个条件,它现在就是这样做的-如果两个条件都为真,那么第一个块中设置的值可能是无关的,因为它将被第二个块覆盖

还不清楚
cartesiancoordination
做了什么,但它的名字很奇怪,是用Java方法命名的——如果它返回
类,那肯定很奇怪。这里的
p
是什么?我不知道您的真实代码是否与此有所不同,但即使撇开无法编译的原因不谈,我还是觉得它有点可疑

有人能告诉我为什么我不能返回“vel”吗

当然-如果两个条件都不是真的,那么你没有给它一个值。变量没有明确赋值,因此无法读取其值以返回它。如果那样的话,你想退货什么?它甚至有效吗?在这种情况下,也许您应该抛出一个异常

就个人而言,我实际上会从每个
if
块返回-我不认为局部变量会增加任何好处。在这一点上,问题将更加明显:

public Velocity add(final Velocity velocity) {
    if (...) {
        ...
        return ...;
    }
    if (...) {
        ...
        return ...;
    }
    // What should we do if we get here?
}
现在,确定返回值的两个条件都只是立即返回,更明显的是(IMO),如果你到达底部,那是因为这两个条件都没有计算为
true
。。。因此,要么返回一些“空”值,要么返回空引用,要么抛出异常

当然,这是假设您不希望第二个条件有效地胜过第一个条件,它现在就是这样做的-如果两个条件都为真,那么第一个块中设置的值可能是无关的,因为它将被第二个块覆盖


还不清楚
cartesiancoordination
做了什么,但它的名字很奇怪,是用Java方法命名的——如果它返回
类,那肯定很奇怪。这里的
p
是什么?我不知道您的实际代码是否与此有所不同,但即使不考虑此代码无法编译的原因,我也觉得它有点可疑。

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


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

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


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

只能返回带有值的变量。因此,
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();
}

只能返回带有值的变量。因此,
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();
}

若我把“return v”放在If语句中,我得到的错误是我的方法并没有返回。。。这就是创建局部变量的原因…@RuslanZarinaSeidovi:并不是因为它没有返回-您将得到一个错误报告,返回语句丢失,因为您可以在不返回任何内容的情况下到达方法的末尾。如果你走了那么远,你想发生什么?你要么返回一些东西,要么抛出一个异常。如果我把“return v”放在If语句中,我得到的错误是我的方法没有返回。。。这就是创建局部变量的原因…@RuslanZarinaSeidovi:并不是因为它没有返回-您将得到一个错误报告,返回语句丢失,因为您可以在不返回任何内容的情况下到达方法的末尾。如果你走了那么远,你想发生什么?您要么必须返回某些内容,要么抛出异常。@RuslanZarinaSeidovi:它可以编译,但这与它的工作方式不同。不要盲目地这样做——想想在没有达到任何一个条件的情况下结束方法意味着什么,以及在这种情况下你希望发生什么。@RuslanZarinaSeidovi:它是编译的——但这与它的工作方式不同。不要盲目地这样做——想想在没有达到任何一个条件的情况下完成方法意味着什么,以及在这种情况下你希望发生什么。