Java,双返回函数,失败后返回什么?

时间:2014-11-21 12:12:41

标签: java php

我正在从PHP迁移到Java,我有点挣扎。

我有这样的方法,我用来从MySQL数据库中获取一些数据,如果没有数据从数据库中获取,我想处理失败。

public double getRate() {
    double ret;
    try {
        // do a select query
        PreparedStatement stmt = conn.prepareStatement("SELECT `rate` FROM `rates` LIMIT 1");
        ResultSet rs = stmt.executeQuery();

        // get result
        rs.absolute(1);
        ret = rs.getDouble(1);

        // close the resources
        rs.close();
        stmt.close();
    }

    // this catches only the SQL errors (if I am right)
    catch (SQLException ex) {
        ex.printStackTrace();
    }

    // THIS IS WRONG BECAUSE "variable ret might not have been initialized"
    return ret;
}

在PHP中,我们可以在发生故障时返回任何内容:

<?php

public function getRate() {
    $ret = db::getOne("SELECT `rate` FROM `rates` LIMIT 1");
    if ($ret) { 
        return $ret; // row has been found, so we return it
    } else {
        return false; // row hasn't been found, so we return false --> THIS is what I need to do in Java
    }
}

?>

那么如何处理我无法返回的Java方法/函数中的失败?

7 个答案:

答案 0 :(得分:2)

您有几种选择:

  • 抛出一个异常,并通过调用该方法的代码捕获它。这很好用,是处理它的好方法。但是需要大量额外的try-catch语句
  • 出错时返回-1。如果您只使用自然数字
  • ,这也是一种非常常见的方法
  • 始终返回结果对象,其中包含输出和成功/错误状态
  • 改为使用Double Class,并在失败时返回null

答案 1 :(得分:2)

在Java中,你不能从一个地方返回double,而从另一个地方返回boolean。你可以做的是,初始化你的Double(double primitive包装器)值,如:

Double ret = null;

如果没有行或任何SQLException,您可以将此值返回给调用者。在调用方法中,您可以执行以下操作:

Double rate = getRate();
if (rate == null) {
    //no row found
} else {
    //i have the row. continue with business logic
}

答案 2 :(得分:1)

您可以使您的方法返回双包装类Double的对象。然后,如果发生某些故障,您可以返回空指针。

public Double getRate() {
    ...
    if(ok)
        return new Double(ret);
    else
        return null;
}

答案 3 :(得分:0)

使用控件值初始化双变量。如果在退出方法时没有更改,则出现问题。

控制值可能是您不希望从查询中获得的内容,因此对于费率,它可能是负数,例如-1,因为费率不能为负。

double ret=-1.00d;

答案 4 :(得分:0)

我正在添加示例代码,以便您了解如何处理此类方案。 如果您的默认值没有更改,则表示没有任何内容与您的查询匹配。

public double methodName(int arg)
{
    double risk=0.0;
    String query = null;
    PreparedStatement stm = null;
    ResultSet r = null;

    Connection con=null;

    try{
        con=ConnectionDB.getConnection();
        if(con!=null)
        {
            query="select risk from table where year="+arg;
            stm = con.prepareStatement(query);
            r = stm.executeQuery();
            if(r.next())
            {
                risk=r.getDouble(1);
            }

        }

    }catch(Exception e)
    {
        e.printStackTrace();
    }
    finally{
        try {
            if (r != null) {
                r.close();
            }
            if (stm != null) {
                stm.close();
            }
            if(con!=null)
            {
                con.close();
            }

        } catch (Exception e) {
            System.out.println("" + e);
        }
    }
    return risk;


}

答案 5 :(得分:0)

你可以返回OptionalDouble,这使调用者明白他们需要处理未找到结果的情况:

try {
    // get ret
    return OptionalDouble.of(ret);
} catch (SQLException ex) {
    return OptionalDouble.empty();
}

答案 6 :(得分:0)

在您的Java示例中,当您谈到&#34;失败&#34; 时,您谈论的是意外错误(例如SQL异常,数据库访问中的非预期错误。)

然而,在您的PHP示例中,当您谈到&#34;失败&#34; 时,您谈论的是正常方案(数据库中没有数据) )。

因此,两个例子都截然不同。

在我看来,如果我得到意外情况,我就不会返回任何值,我抛出 异常< / strong>即可。我通常会返回 null -1 以及正常和预期场景中的这种值,这些场景中没有数据要返回。< / p>