2016-04-13 12 views
5

これは私が持っているコードです:IntelliJは、なぜこのような状況で参照がnullになることができないと伝えていますか?

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

そしてIntelliJのは、メッセージと上記の最後の文を掲載して警告します:

条件「バー= nullを!」「真」は常にあります。この検査 は、常に真または偽である可能性のある条件 を報告するメソッド制御とデータフローを分析し、値が静的には であることが判明した式と、NULL許容性につながる可能性のある状況 契約違反です。

entityClazz = Hibernate.getClass(bar); 

警告が消えてしまいます。私は文を削除すると

ここでIntelliJの心の中で何が起こっているのですか?バーがヌルになるのは何ですか?

+3

私は推測、 'Hibernate.getClass(バー)はbar'がnullの場合、' 'NullPointerExceptionがスローされますので、'もしので、その場合、決して達成されません。 –

+0

@a_horse_with_no_nameコードにNPEがスローされているのを見たことがありませんでしたが、おそらく私はそれを見逃しました.. –

+0

'Hibernate.getClass'が' @ NotNull'を持っているかどうかを確認してください。 –

答えて

3

これは、hibernateのドキュメントに従って、これはorg.hibernate.HibernateクラスのgetClass()メソッドが行うものです。ドキュメントHibernateException 1として

public static Class getClass(Object proxy) { 
     if (proxy instanceof HibernateProxy) { 
      return ((HibernateProxy) proxy).getHibernateLazyInitializer() 
        .getImplementation() 
        .getClass(); 
     } 
     else { 
      return proxy.getClass(); 
     } 
    } 

RuntimeExceptionNestableRuntimeExceptionの拡張クラスであるヌルパラメータの場合にスローされます。

のIntelliJは、簡単にLOC

entityClazz = Hibernate.getClass(bar); 

がNPEをスローすることを発見されたそのコードの検査を使用し、これを分析することができます。 NPEをスローすると、NestableRuntimeExceptionがチェックされていない例外としてif条件文に到達することはありません。

ヌルセーフメソッドには理想的なHibernate.getClass(bar)の上にif条件を配置できます。

希望がクリアされます。

参照

Hibernate Documentation

Code Analysis - Intellij

Code Inspection - Intellij

+0

「nullパラメータの場合、HibernateExceptionがスローされる」というドキュメントはどこにありますか? –

+0

まあ、それはNPEのためだと言う文書はありません。 Javadocを参照してください。ただし、org.hibernate.proxy.AbstractLazyInitializerクラスのinitialize()メソッドを確認してください。 – aksappy

関連する問題