当前位置: 首页 > 知识库问答 >
问题:

在finally中处理空连接

左丘弘致
2023-03-14

我建立了一个数据库连接。然后,我尝试建立连接,如果出现异常,则返回。在代码的下面,我有一个Finally块,我打算用它作为一个catch all来关闭连接。

Connection con = null;
try{
  try{
     con = connectDB();
  }
  catch{
     return;
  }
  ...code
catch{
  return;
}
finally{
    con.close();
} 

然而,如果初始连接失败,它将跳转到我的con所在的最后一个块。close()引发空指针异常。最好的办法是什么?有没有办法测试con是否为null?我试过if(con.isValid(0))和con。等于(null)和con==null,它们都不起作用。

共有3个答案

葛浩阔
2023-03-14
匿名用户

您可以使用con!=空对象。nonNull(con)检查连接对象是否不为null,然后在最后关闭它,如下图所示:

Connection con = null;
try{
     con = connectDB();
     //add your code
  catch{
      //log exception
      return;
  } finally {
    if(Objects.nonNull(con)) { //or use con != null
        con.close();
    }
}

或者也可以使用try with resources(因为连接实现了自动关闭),如下所示:

try(Connection con = connectDB()) {
   //code
catch {
   return;
}

郭洋
2023-03-14
if (con.isValid(0))

如果con为null,则无法工作。您将调用null变量的一个成员,导致null点异常。

这同样适用于

con.equals(null)

现在

if ( con == null )

确实有效,但您希望进行负面比较:

if ( con != null )

相反

濮阳旺
2023-03-14

Connection实现了AutoClosable,因此您可以使用try with资源语句。

try (Connection con = connectDB()) {
    [some code]
} 
 类似资料:
  • 所以,场景是我正在做一些数据库操作,最后提交/回滚,然后连接关闭。但是连接关闭也会抛出SQLException。 在这种情况下,最好的方法是什么? 捕获并记录它。 捕获并抛出异常,以便调用函数可以处理它 在#1的情况下,调用函数永远不会知道出了问题。

  • 我刚刚意识到,当任何参数为null时,JPQL where子句都不能像我预期的那样工作。例如,这个简单的JPQL查询 当参数为null时不返回任何结果,即使数据库中存在名称设置为null的实体。 在这种情况下,Hibernate使用WHERE实体执行SQL。名称=空。显然,这不是由数据库处理的,因为对于空比较,标准定义为NULL(请参见SQL is NULL and=NULL)。JPQL还有一个

  • 我使用从我的mysql数据库添加节点到。 我的问题是记录中的某些列值可能为null。我如何在cypher查询中处理它们,因为对于mysql表中的null值,它没有创建任何节点。 下面是我使用neo4j java驱动程序创建节点的代码 在neo4j浏览器控制台中,当我在cypher下面运行查询时,没有形成任何节点。 更新:我能够在Java处理空值。但是对于另一张桌子,我有一些奇怪的行为。 在Neo4

  • 如果我有下面这样的事务方法,在事务提交和回滚的情况下,最后一个块是什么时候执行的?例如,如果“使用hibernate在数据库中持久化某个实体”引发了一些hibernate异常,这是真的吗? 1) 事务回滚2)最后执行块 或者 1)最后执行块2)事务回滚

  • 本文向大家介绍详解Java异常处理中finally子句的运用,包括了详解Java异常处理中finally子句的运用的使用技巧和注意事项,需要的朋友参考一下 当异常被抛出,通常方法的执行将作一个陡峭的非线性的转向。依赖于方法是怎样编码的,异常甚至可以导致方法过早返回。这在一些方法中是一个问题。例如,如果一个方法打开一个文件项并关闭,然后退出,你不希望关闭文件的代码被异常处理机制旁路。finally关