为什么IntelliJ告诉我在这种情况下引用不能为null



这是我的代码:

private void foo(Bar bar) {
    Session session = null;
    Class entityClazz = null;
    try {
        entityClazz = Hibernate.getClass(bar);
        if (bar != null) {

IntelliJ将警告我上面的最后一条声明,并显示消息:

条件'bar!=null总是true。本次检查分析方法控制和数据流以报告可能的条件始终为true或false,值为静态的表达式被证明是恒定的,以及可能导致可为null的情况违反合同。

当我删除声明时:

entityClazz = Hibernate.getClass(bar);

警告将消失。

IntelliJ脑子里在想什么,是什么阻止了bar为null?

根据hibernate文档,这就是org.hibernate类中的getClass()方法的作用。

public static Class getClass(Object proxy) {
        if ( proxy instanceof HibernateProxy ) {
            return ( ( HibernateProxy ) proxy ).getHibernateLazyInitializer()
                    .getImplementation()
                    .getClass();
        }
        else {
            return proxy.getClass();
        }
    }

根据文档,在参数为null的情况下抛出HibernateException,这是NestableRuntimeException的扩展类,也是RuntimeException

Intellij能够分析这一点,使用其代码检查可以很容易地发现loc

entityClazz = Hibernate.getClass(bar);

会抛出NPE。如果抛出NPE,则永远不会到达If条件语句,因为NestableRuntimeException是未检查的异常。

您可以将if条件放置在Hibernate.getClass(bar)之上,这对于null安全方法来说是理想的。

希望一切顺利。

参考

Hibernate文档

代码分析-Intellij

代码检查-Intellij

相关内容

最新更新