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

Java,双返回函数,失败时返回什么?,java,php,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"); Resu

我正在从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
    }
}

?>

使用控制值初始化双变量。如果退出该方法时没有更改,则表示出现了问题

控制值可以是您不希望从查询中获得的值,因此对于速率,它可以是负数,比如说
-1
,因为速率不能是负数

double ret=-1.00d;

用控制值初始化双变量。如果退出该方法时没有更改,则表示出现了问题

控制值可以是您不希望从查询中获得的值,因此对于速率,它可以是负数,比如说
-1
,因为速率不能是负数

double ret=-1.00d;

您可以使您的方法返回双包装类
double
的对象。然后,如果出现故障,您可以返回空指针

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

您可以使您的方法返回双包装类
double
的对象。然后,如果出现故障,您可以返回空指针

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

您有几个选择:

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

您有几种选择:

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

我正在添加一个示例代码,以便您了解如何处理此类场景。 如果默认值不变,则表示没有与查询匹配的内容

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;


}

我正在添加一个示例代码,以便您了解如何处理此类场景。 如果默认值不变,则表示没有与查询匹配的内容

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;


}

在Java中,不能从一个位置返回double,从另一个位置返回boolean。您可以做的是,初始化Double(Double原语的包装器)值,如下所示:

Double ret = null;
若并没有行或任何SQLException,那个么您将把这个值返回给调用者。在被调用的方法中,您可以执行以下操作:

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

在Java中,不能从一个位置返回double,从另一个位置返回boolean。您可以做的是,初始化Double(Double原语的包装器)值,如下所示:

Double ret = null;
若并没有行或任何SQLException,那个么您将把这个值返回给调用者。在被调用的方法中,您可以执行以下操作:

Double rate = getRate();
if (rate == null) {
    //no row found
} else {
    //i have the row. continue with business logic
}
您可以返回一个,这使调用者很明显,他们需要处理找不到结果的情况:

try {
    // get ret
    return OptionalDouble.of(ret);
} catch (SQLException ex) {
    return OptionalDouble.empty();
}
您可以返回一个,这使调用者很明显,他们需要处理找不到结果的情况:

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

在Java示例中,当您谈论“失败”时,您谈论的是一个意外的错误(例如SQL异常,DB访问中的非预期错误)

然而,在PHP示例中,当您谈论“失败”时,您谈论的是一个正常的场景(数据库中没有数据)

所以,这两个例子是完全不同的


在我看来,如果我得到一个意外的情况,我不会返回任何值,我会抛出一个异常。我通常返回null-1以及在正常和预期的情况下没有数据返回的此类值。

在您的Java示例中,当您谈论“失败”时,您谈论的是一个意外的错误(例如SQL异常,DB访问中的非预期错误)

然而,在PHP示例中,当您谈论“失败”时,您谈论的是一个正常的场景(数据库中没有数据)

所以,这两个例子是完全不同的

在我看来,如果我得到一个意外的情况,我不会返回任何值,我会抛出一个异常。我通常返回null-1,在正常和预期的场景中,如果没有数据可返回,则返回此类值