findbugs显示sessionFactory为null保证被解除引用

时间:2014-09-03 11:38:41

标签: java findbugs

在我的应用程序中,我使用会话工厂创建会话。 当我执行此检查时,FindBug向我显示警告“sessionFactory为null保证被取消引用”。怎么解决这个问题?

  if (!sessionFactory.isClosed()) {
            session.close();
            sessionFactory.close();
       }

2 个答案:

答案 0 :(得分:2)

整个代码可能看起来像这样

SessionFactory sessionFactory = null;
Session session = null;

try{
    do some stuff
catch(Exception e){

} finally {
  if (!sessionFactory.isClosed()) {
            session.close();
            sessionFactory.close();
       }
}

Findbugs看到你的变量开头为null,如果你的try块中有异常,那么变量可能没有被初始化。因此它给出了一个错误。 通过添加空检查,它很容易解决:

  if (sessionFactory!= null && !sessionFactory.isClosed()) {
            if(session != null){
             session.close();
            }
            sessionFactory.close();
       }

答案 1 :(得分:0)

Findbug显示

异常路径上有一个语句或分支,如果执行则保证此时值为空,并保证该值被取消引用(涉及运行时异常的转发路径除外)

可能的情况/用例/案例是这样的。

1。)当代码中存在分支时,我们假设在分支中初始化对象并从分支中访问该对象(没有空检查)。

user3227602 显示代码时,您已将 sessionFactory 对象声明为NULL对象,并在 try-catch-finally 块中初始化它。

想象一个场景,在初始化之前,如果发生异常(由于某些处理),那么流将进入catch - finally块。因此sessionFactory仍然只声明为NULL对象。所以空检查是可取的。

2.。)当代码中出现一些语句( if-elseif-else )时,我们假设初始化该块中的对象(如果是block,elseif block或in else block)并访问那个对象(没有空检查)。

if(condition1)
{
       //blah blah
       sessionFactory = new Configuration().configure().buildSessionFactory();
       //blah blah
}
else
{
       //blah blah
}
if (!sessionFactory.isClosed()) {
       session.close();
       sessionFactory.close();
}

如果 condition1的结果为false ,那么您的sessionFactory对象将永远不会启动。 因此需要进行NULL检查。