在我的应用程序中,我使用会话工厂创建会话。 当我执行此检查时,FindBug向我显示警告“sessionFactory为null保证被取消引用”。怎么解决这个问题?
if (!sessionFactory.isClosed()) {
session.close();
sessionFactory.close();
}
答案 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检查。