gpt4 book ai didi

java - 从 DB (Java) 获取数据时选择返回值的良好做法是什么?

转载 作者:行者123 更新时间:2023-12-01 13:16:32 26 4
gpt4 key购买 nike

我想从数据库中的表中获取文本版本。

我想知道三件事:

-如果返回0则没有版本

-如果它返回1或>=1那么就有一个版本

-如果与数据库的连接在获取数据时出现问题或任何类型的问题,那么它应该返回-1

让我们阅读这段代码,看看我是否做得正确。我最后返回-1

public static int getData(String title){
Connection myCon=null;
PreparedStatement preparedStmt=null;
try{
myCon=getUnusedConnection();
String sql="select version from table where title=?";
preparedStmt=myCon.prepareStatement(sql);
preparedStmt.setString(1, title);
ResultSet results=preparedStmt.executeQuery();
int version=0;
if(results.next()){
version=results.getInt(1);

}
return version; // a version existed
}
catch(SQLExcetion ex){
while (ex != null) {
System.out.println ("SQL Exception: " +
ex.getMessage ());
ex = ex.getNextException ();
}
}catch (java.lang.Exception e) {
System.out.println("***ERROR-->" + e.toString());
}
finally{
releaseConnection (myCon);
closeStatement (preparedStmt);
}
return -1; // db or java problem
}

最佳答案

返回错误代码是一种非常过时的做法。使用异常对象不仅可以指定错误的类型,还可以指定错误所需的任何类型的数据。该模式实际上非常简单:返回函数应该输出的内容,并在遇到错误时抛出异常。如果做得正确,您永远不必解释返回值。

将异常包装在其他异常中是一种很好的做法,以便方法的调用者可以轻松处理这些异常。所以这将是一个好的开始:

// your wrapper
class DbException extends Exception {
public DbException(string msg, Throwable rootCause) {
super(msg, rootCause);
}
}

public static int getVersion(String title) throws DbException {
try {
// get version
....
//
} catch (SQLException ex) {
throw new DbException("Problem getting version", SqlException ex);
}
return version;
}

既然现在你的方法的输出是清楚的,我已将getData重命名为getVersion,因为这总是得到的。

您的包装器异常也可以是更抽象的类型,只是 DbException (如 TurnWrapper),如果您不希望每个调用者显式处理您的异常,您也可以选择使用 RuntimeException 而不是受检查的异常(我通常这样做)。

话虽如此,如果没有版本是否是一个错误,这是有道理的。如果您的代码库无意遇到解决版本问题,那么它就是一个错误,您应该抛出异常。从您的方法的签名来看,尽管无法解析版本似乎很有可能。字符串标题可以是任何内容,因此您会留下很大的空间无法解析版本。

现在有几个选项:

1) 您可以返回 Integer,而不是返回 int,并在无法解析版本时返回 null。这种方法的问题在于,您为引发 NullPointerException 留下了空间。我不建议这样做,除非您使用的 IDE 可以帮助您捕获此类问题。 Eclipse for example has an excellent @Nullable annoation that can prevent NPE at comile time 。你的方法签名将变成

public @Nullable Integer getVersion(String title) throws DbException 

如果您有 @Nullable 编译时检查,我更喜欢这个签名,因为这样您的调用代码将被迫检查空指针,并且方法签名是不言自明的。

2)按照您的建议返回一个 int ,但负值意味着无法获取版本。这可以防止 NPE,但仍然会出现错误。这很简单。你的 siguanture 将变成:

/**
* @return version or -1 if no version could be resolved
*/
public int getVersion(String title) throws DbException

关于java - 从 DB (Java) 获取数据时选择返回值的良好做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22422764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com