Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从DB(Java)获取数据时,选择返回值的最佳实践是什么?_Java - Fatal编程技术网

从DB(Java)获取数据时,选择返回值的最佳实践是什么?

从DB(Java)获取数据时,选择返回值的最佳实践是什么?,java,Java,我想从DB中的表中获取文本的版本 我想知道三件事: -如果它返回0,则没有版本 -如果它返回1或>=1,则存在一个版本 -如果与DB的连接在获取数据时出现问题或任何类型的问题,则应返回-1 让我们读一下这段代码,看看我做得是否正确。I返回-1结尾处 public static int getData(String title){ Connection myCon=null; PreparedStatement preparedStmt=null; try{ myC

我想从DB中的表中获取文本的版本

我想知道三件事:

-如果它
返回0
,则没有版本

-如果它
返回1
或>=1,则存在一个版本

-如果与DB的连接在获取数据时出现问题或任何类型的问题,则应
返回-1

让我们读一下这段代码,看看我做得是否正确。I
返回-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
}

如果问题属于例外情况,您应该选择例外情况。如果您坚持使用返回码,我建议使用带有助记项的
enum
,例如

public enum ReturnValues {
    NO_VERSION(0), VERSION_FOUND(1), ERROR(-1);

    private final int code;

    private ReturnValues(int code) {
        this.code = code;
    }

    public int getCode() {
        return this.code;
    }
}

如果要清除选中的SqlException,则:

throw new IllegalStateException("Database connection failure",originalSqlException);
如果没有版本:

return null;  // do not fear nothing. In this case it is truly nothing.
在javadoc中指出,如果找不到版本,该方法将返回null,如果存在数据库问题,它可能会抛出IllegalStateException

不要捕获所有类型的异常,也不要记录任何内容

此时不需要记录错误,只需让调用方处理异常即可

catch( SQLException ex ){
    throw new IllegalStateException("Database connection failure",ex);
    }
}
finally {
    //etc...

返回错误代码是一种非常过时的做法。使用异常对象不仅可以指定错误的类型,还可以指定需要伴随错误出现的任何类型的数据。模式非常简单:返回函数的输出应该是什么,遇到错误时抛出异常。如果操作正确,您永远不必解释返回值

在其他异常中封装异常是一种很好的做法,这样可以使方法的调用方轻松地处理这些异常。因此,这将是一个良好的开端:

// 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而不是checked异常

尽管如此,如果没有一个版本是不是一个错误,这是有道理的。如果您的代码库在解析版本时不会遇到问题,那么这是一个错误,您应该抛出一个异常。从您的方法的签名判断,尽管无法解析版本似乎是完全可能的。字符串标题可以是任何内容,因此您将为无法解析版本留下很大的空间

现在有几个选项:

1) 当无法解析任何版本时,可以返回整数并返回null,而不是返回int。这种方法的问题是,会留下导致NullPointerException的空间。我不会建议这样做,除非您使用的IDE可以帮助您解决此类问题。您的方法签名将成为

public @Nullable Integer getVersion(String title) throws DbException 
如果您有@Nullable编译时检查,我更喜欢这个签名,因为这样您的调用代码就必须检查空指针,并且方法签名是自解释的

2) 按照您的建议返回一个int,但负值表示无法获取任何版本。这可以防止NPE,但仍然会留下错误的空间。这很简单。您的标志将成为:

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

就我个人而言,我宁愿在出现问题时抛出一个异常,并返回一个布尔值来表示成功/失败@fge,如果返回true或false,那么我如何获得版本,版本可以是1、2、3……那么现在您想要版本了吗?这不是您最初的问题所要问的,只是关于代码的反馈,而不是问题,“版本”在您的表中可以为空吗?如果是这样,代码似乎不会返回“0”值。因为如果没有获取结果,它将返回'-1',因为流将到达末尾。@Rebecca,它像一个方法检查3件事,所以方法的名称应该更改,然后“如果问题是异常情况,您应该选择异常。”u没有明确说明如何在获取数据Java代码的上下文中执行此操作。你只是创建了一个类枚举,但我的现实世界项目非常复杂,它有Inter.parseInt。。。。那么我也应该捕获异常吗?您也可以捕获ParseException。如果要向用户指出版本号存在特定问题,请创建特定于应用程序的异常,说明版本号格式不正确。(可能是一个通用的应用程序错误,其代码可用于显示翻译后的错误文本。)在适当的位置捕捉该异常(尽可能“高”),并显示适当的错误消息。非常感谢,我认为这正是我需要的。这是正确的做法。我是在学校里学的,没有任何专业经验,所以他们就这样教我21世纪的C风格编程。你的学校应该被吊销教学许可证:)