这是我的代码:
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?
答案 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安全方法来说是理想的。
希望这清楚。
参考