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

时间:2016-04-13 07:01:04

标签: java intellij-idea

这是我的代码:

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

IntelliJ将警告我上面的最后一条声明:

  

条件'bar!= null'始终为'true'。这次检查   分析方法控制和数据流以报告可能的情况   总是真或假的表达式,其值是静态的   被证明是不变的,以及可能导致可空性的情况   合同违规。

当我删除声明时:

entityClazz = Hibernate.getClass(bar);

警告将消失。

IntelliJ的想法在这里发生了什么,什么阻止bar为null?

1 个答案:

答案 0 :(得分: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();
        }
    }

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

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

entityClazz = Hibernate.getClass(bar);

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

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

希望这清楚。

参考

Hibernate Documentation

Code Analysis - Intellij

Code Inspection - Intellij