【问题标题】:Why is IntelliJ telling me that reference can not be null in this situation?为什么 IntelliJ 告诉我在这种情况下引用不能为空?
【发布时间】:2016-08-04 02:31:41
【问题描述】:

这是我的代码:

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 为空?

【问题讨论】:

  • 我猜,因为如果bar 为空,Hibernate.getClass(bar) 将抛出 NullPointerException,因此在这种情况下永远不会到达 if
  • @a_horse_with_no_name 我没有看到代码中抛出任何 NPE,但也许我错过了..
  • 检查Hibernate.getClass的参数是否有@NotNull
  • BTW IntelliJ 有一个它“知道”应该是 @NotNull 的常用方法列表(不确定它存储此信息的位置,但想象一下它是某个 XML 文件)
  • @PeterLawrey 文档在这里,我没有看到任何 NutNull:docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/…

标签: java intellij-idea


【解决方案1】:

根据 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 在空参数的情况下被抛出,它是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

【讨论】:

  • 你在哪里找到'根据文档 HibernateException is throw in case of a null parameter'?
  • 嗯,没有文件说这是因为 NPE。参考 Javadocs 但检查 org.hibernate.proxy.AbstractLazyInitializer 类中的 initialize() 方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多