7

我是java新手,但我很快就学会了。我一直遇到的一件事是我最终拥有一个充满查询和一般代码的函数,我想将它分解为单独的函数。以此为例:

public ResultSet getApples (){
    ResultSet rs;
    try{
        PreparedStatement stmt = con.prepareStatement("SELECT * FROM fruit WHERE type='apples'");
        rs = stmt.executeQuery();
    } catch (SQLException e){
        e.printStackTrace();
    }
    return rs;  
}

理想情况下,这将是我想要做的,在一个函数中拥有所有的 try 和 catch,但这给了我错误:Local variable may not have been initilized

我确实意识到我可以这样做:


public function start(){
    try{
        ResultSet apples = getApples();
    catch (SQLException e){
        e.printStackTrace();
    }
}

public ResultSet getApples () throws SQLException { 
    PreparedStatement stmt = con.prepareStatement("SELECT * FROM fruit WHERE type='apples'");
    return stmt.executeQuery();
}

但我真的更希望在函数内处理异常并返回结果。

编辑 好吧,对所提供的内容进行修改后的答案。我在这个问题上的全部目标是使我的脚本的主要功能尽可能干净。即使是额外if ( _resultSet != null )的东西,我也不是很喜欢。话虽如此,我对这个结果很满意:

public ResultSet getApples (){
    try{
        PreparedStatement stmt = con.prepareStatement("SELECT * FROM fruit WHERE type='apples'");
        return stmt.executeQuery();
    } catch (SQLException e){
        System.out.println("************************");
        System.out.println("Class.getApples null");
        System.out.println(e.getMessage());
        return null;
    }   
}

一切都在getApples函数内处理,当_resultSet.next()被调用时,我得到 aNullPointerException和 getApples 异常中的打印,因此我能够快速找到错误并进行调试。

4

5 回答 5

3

首先将 rs 初始化为 null。

public ResultSet getApples (){
    ResultSet rs = null;
    try{
        PreparedStatement stmt = con.prepareStatement("SELECT * FROM fruit WHERE type='apples'");
        rs = stmt.executeQuery();
    } catch (SQLException e){
        e.printStackTrace();
    }
    return rs;  
}
于 2012-08-10T12:51:53.207 回答
3

你可以这样声明你的 RS

ResultSet rs = null;

但是你在哪里调用你的函数:

ResultSet apples = getApples ()

你必须检查:

if(apples == null)
{
    //do something, because your query did not work.
}
于 2012-08-10T12:52:43.237 回答
2

因为您没有将 ResultSet rs 设置为任何初始值。最后你要归还它。如果发生任何异常并且 rs 值中没有设置值怎么办。为了解决您需要在声明时为 rs 分配空值。

于 2012-08-10T12:54:08.190 回答
1

我在您的第一个示例中看到的最大问题(除了不初始化rs)是您没有正确处理清理。你应该有一个finally关闭的块stmt

确保所有这些都发生的一种非常好的方法是使用 Spring 的JDBCTemplate(更多文档在这里)。这将为您处理所有连接管理细节;您只需编写 SQL 和代码来处理ResultSet. 更好的是,它允许您使用 Spring 的声明式事务管理。

于 2012-08-10T13:40:53.617 回答
0

您可以使用CachedRowSet。有关详细答案,您可以在此处查看我的答案

于 2014-06-21T18:24:32.470 回答