2016-04-13 18 views
5

Questo è il codice che ho:Perché IntelliJ mi sta dicendo che il riferimento non può essere nullo in questa situazione?

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

E IntelliJ mi mettere in guardia per l'ultima dichiarazione di cui sopra con il messaggio:

Condizione 'bar! = Null' è sempre 'vero'. Questa ispezione analizza il controllo del metodo e il flusso di dati per riportare possibili condizioni che sono sempre vere o false, espressioni il cui valore è statico dimostrato di essere costante e situazioni che possono portare a violazioni del contratto di nullità .

Quando si elimina la dichiarazione:

entityClazz = Hibernate.getClass(bar); 

l'avviso sarà andato.

Che cosa sta succedendo nella mente di IntelliJ qui, cosa si sta fermando dal fatto che la barra è nulla?

+3

immagino, perché 'Hibernate.getClass (bar)' lancerà una NullPointerException se 'bar' è nullo e quindi la' se 'non sarà mai raggiunto in quel caso. –

+0

@a_horse_with_no_name Non ho visto alcun NPE gettato nel codice ma forse l'ho perso .. –

+0

Controlla se 'Hibernate.getClass' ha un' @ NotNull' sul suo parametro. –

risposta

3

Come per la documentazione di ibernazione, questo è il metodo getClass() nella classe org.hibernate.Hibernate.

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

Come per la documentazione HibernateException è gettato in caso di un parametro null, che è una classe estesa di NestableRuntimeException anche una RuntimeException.

Intellij è in grado di analizzare questo, utilizzando i suoi controlli di codice è facilmente trovato che il loc

entityClazz = Hibernate.getClass(bar); 

getterebbe un NPE. Se lancia un NPE, l'istruzione condizione if non viene mai raggiunta, poiché NestableRuntimeException sono eccezioni non selezionate.

È possibile posizionare la condizione if sopra Hibernate.getClass (barra) che sarebbe l'ideale per un metodo di sicurezza nulla.

Spero che questo cancella.

Riferimenti

Hibernate Documentation

Code Analysis - Intellij

Code Inspection - Intellij

+0

Dove hai trovato "Come per la documentazione HibernateException viene lanciata in caso di un parametro nullo"? –

+0

Beh, nessun documento dice che è a causa di NPE. Fare riferimento a Javadocs, ma controllare il metodo initialize() nella classe org.hibernate.proxy.AbstractLazyInitializer – aksappy