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

Kor*_*gay 6 java intellij-idea

这是我的代码:

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

并且IntelliJ将通过以下消息警告我上面的最后一个声明:

条件'bar!= null'始终为'true'.此检查分析方法控制和数据流,以报告始终为真或假的可能条件,静态证明其值为常量的表达式,以及可能导致违约性合同违规的情况.

当我删除声明时:

entityClazz = Hibernate.getClass(bar);
Run Code Online (Sandbox Code Playgroud)

警告将消失.

这里IntelliJ的想法是什么,什么阻止bar为null?

aks*_*ppy 3

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

public static Class getClass(Object proxy) {
        if ( proxy instanceof HibernateProxy ) {
            return ( ( HibernateProxy ) proxy ).getHibernateLazyInitializer()
                    .getImplementation()
                    .getClass();
        }
        else {
            return proxy.getClass();
        }
    }
Run Code Online (Sandbox Code Playgroud)

根据文档,HibernateException如果参数为 null,则会抛出该参数,该参数NestableRuntimeException也是RuntimeException.

Intellij 能够对此进行分析,使用其代码检查很容易发现 loc

entityClazz = Hibernate.getClass(bar);
Run Code Online (Sandbox Code Playgroud)

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

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

希望这一切能够澄清。

参考

休眠文档

代码分析-Intellij

代码检查 - Intellij