2015-08-05 12 views
8

ho il seguente codice:Suggerimento Intellij Idea: la condizione è sempre falsa: può essere vero qui? (Java)

public String testExitPoints() { 
    boolean myBoolean = false; 
    try { 
     if (getBoolean()) { 
      return "exit 1"; 
     } 
     if (getBoolean()) { 
      throw new RuntimeException(); 
     } 
    } finally { 
     myBoolean = true; 
    } 
    if (getBoolean()) { 
     return "exit 2"; 
    } 
    return "exit 3"; 
} 

public static boolean getBoolean() { 
    Random rand = new Random(); 
    return rand.nextInt() > 100; 
} 

Ora IntelliJ IDEA mi dà per la seconda e la terza invocazione getBoolean() il seguente suggerimento:

Condition 'getBoolean()' is always 'false' 

Ora la mia comprensione, che non è true, dal getBoolean() può essere true o false, a seconda del valore casuale generato. Mi manca qualcosa qui, o è un bug in IntelliJ Idea?

+0

Penso di no. Invoca un altro 'getBoolean()' rispetto a quello che hai postato, o è un bug in Intellij Idea (nel qual caso dovresti presentare un bug report). Cosa ottieni quando esegui il tuo codice? – Axel

+0

Non c'è altro 'getBoolean()', è solo un progetto di test per questo metodo. L'esecuzione del codice a volte restituisce 'false e talvolta' true' come ci si aspetterebbe. –

+0

Se il valore restituito da 'getBoolean()' non è casuale, IntelliJ sarebbe corretto. Quindi immagino che sia davvero un bug (leggi come: forse una sorta di ottimizzazione/semplificazione errata). – Marvin

risposta

7

Non è un bug. È una caratteristica :)

Se guardi attentamente nel tuo IDE, ti dirà che la seconda e la terza chiamata a getBoolean() sono sempre false, ma non la prima.

L'idea presuppone (in questo caso in modo errato) che il metodo, essendo senza parametri e chiamato "get" ..., restituisca sempre lo stesso valore.

Se così fosse, e la prima chiamata era vera, l'altra non sarebbe mai stata aperta (a causa del ritorno).

Se la prima chiamata era falsa, lo sarebbero anche le altre.

IDEA cerca di essere intelligente w.r.t. buone pratiche di codifica, ma non è infallibile.

Se si cambia il metodo per avere parametri (o rinominarlo in modo da non apparire come un getter)

public boolean getBoolean(int x) { 
    Random rand = new Random(); 
    return rand.nextInt() > 100; 
} 

Le avvertenze andrà via (anche se si richiama con lo stesso argomento tutti i tempi) .

(Si noti che, anche se è stato un getter, se è per un campo non finale è ancora sbagliata, in quanto può cambiare in un ambiente multithreading!)

+0

Interessante. Sarebbe davvero un errore quindi - chiamare un metodo senza parametri non significa che non ci possano essere effetti collaterali o valori di ritorno diversi. –

+0

Anche una modifica a 'public statico booleano getBoolean (int ... x) {' fa il trucco qui (che non include la necessità di cambiare anche le invocazioni). –

+0

@MathiasBader hai ragione. Ho sbagliato a spiegarlo: si tratta di leggerlo come un getter. Vedi la risposta aggiornata (nota: è ancora sbagliato, può essere disattivato in un ambiente multithreading anche come getter !, ma non dovrebbe accadere nella maggior parte dei casi) IDEA fa il meglio, ma non è perfetto. –

1

IDEA ritiene che la chiamata getBoolean( non venga modificata quando viene chiamata per la seconda (o terza volta). Normalmente se si restituisce lo stesso valore, la seconda chiamata potrebbe non essere mai raggiunta. Ecco perché l'IDEA lo evidenzia.

0

Nel mio caso se si utilizza MY_ACTUAL_CLASS_NAME. getBoolean() non si lamenta (poiché il metodo è statico). Può essere perché IntelliJ Idea non tiene conto delle statiche (un possibile bug qui)