2016-04-13 35 views
5

這是我的代碼:爲什麼IntelliJ告訴我在這種情況下引用不能爲空?

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

和IntelliJ會提醒我的最後一條語句以上消息:

條件「吧!= NULL」始終是「真」。此檢查 分析方法控制和數據流,以報告始終爲真或假的可能條件 ,靜態值爲 的表達式被證明是恆定的,並且可能導致違反合同的可空性 。

當我刪除聲明:

entityClazz = Hibernate.getClass(bar); 

警告將會消失。

在IntelliJ的腦海裏發生了什麼事,什麼是阻止酒吧爲空?

+3

我猜,因爲'Hibernate.getClass(巴)'將拋出一個NullPointerException如果'bar'爲空,因此如果'在這種情況下永遠不會達到。 –

+0

@a_horse_with_no_name我沒有看到代碼中出現任何NPE,但可能我錯過了它。 –

+0

檢查'Hibernate.getClass'是否在其參數中有'@NotNull'。 –

回答

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在一個空的參數,它是一個擴展類的NestableRuntimeException也是RuntimeException的情況下被拋出。

的IntelliJ是能夠分析這一點,使用它的代碼檢查很容易發現祿

entityClazz = Hibernate.getClass(bar); 

將拋出一個NPE。如果它拋出一個NPE,if條件語句永遠不會到達,因爲NestableRuntimeException是未經檢查的異常。

您可以將if條件放在Hibernate.getClass(bar)之上,這對於一個空安全方法來說是理想的。

希望這個清除。

參考

Hibernate Documentation

Code Analysis - Intellij

Code Inspection - Intellij

+0

你在哪裏找到'根據文檔HibernateException拋出的情況下,null參數'? –

+0

那麼,沒有文件說這是因爲NPE。引用Javadocs,但在org.hibernate.proxy.AbstractLazyInitializer類中檢查initialize()方法 – aksappy

相關問題