我是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;
}
理想情况下,这就是我想做的事情,在一个函数中完成所有尝试和捕获,但这给了我错误: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()
被调用时,我得到一个NullPointerException
并且在getApples异常中打印,所以我能够快速找到错误并进行调试。
答案 0 :(得分: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;
}
答案 1 :(得分:3)
您可以像这样声明您的RS
ResultSet rs = null;
但你在哪里调用你的函数:
ResultSet apples = getApples ()
你必须检查:
if(apples == null)
{
//do something, because your query did not work.
}
答案 2 :(得分:2)
因为您没有将ResultSet rs设置为任何初始值。最后你要归还它。 如果发生任何异常并且rs值没有设置值,该怎么办?为了解决这个问题,你需要在声明时为rs赋值。
答案 3 :(得分:1)
我在第一个示例中看到的最大问题(除了不初始化rs
之外)是您没有正确处理清理。您应该有finally
块关闭stmt
。
确保所有这一切发生的一个非常好的方法是使用Spring的JDBCTemplate(更多文档here)。这将为您处理所有连接管理细节;您只需编写SQL和代码来处理ResultSet
。更好的是,它允许您使用Spring的声明式事务管理。
答案 4 :(得分:0)
您可以使用CachedRowSet。有关详细答案,您可以查看我的answer here