我正在从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方法/函数中的失败?
答案 0 :(得分:2)
您有几种选择:
答案 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>