2015-08-05 19 views
8

Ich habe den folgenden Code:Intellij Idee Hinweis: Bedingung ist immer falsch - kann das hier wahr sein? (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; 
} 

Jetzt Idee IntelliJ gibt mir für den zweiten und dritten Aufruf von getBoolean() den folgenden Hinweis:

Condition 'getBoolean()' is always 'false' 

Nun zu meinem Verständnis, das ist nicht true, da getBoolean() entweder true oder false sein kann, abhängig vom generierten Zufallswert. Fehle ich hier etwas oder ist das ein Fehler in IntelliJ Idea?

+0

denke ich nicht. Sie rufen entweder ein anderes 'getBoolean()' als das auf, was Sie gepostet haben, oder es ist ein Fehler in Intellij Idea (in diesem Fall sollten Sie einen Fehlerbericht einreichen). Was bekommst du, wenn du deinen Code ausführst? – Axel

+0

Es gibt kein anderes 'getBoolean()', es ist nur ein Testprojekt für diese Methode. Das Ausführen des Codes gibt manchmal "falsch" und manchmal "wahr" zurück, wie Sie es erwarten würden. –

+0

Wenn der Rückgabewert von 'getBoolean()' nicht zufällig war, wäre IntelliJ korrekt. Also ich denke, es ist in der Tat ein Fehler (lesen Sie: vielleicht eine Art von inkorrekter Optimierung/Vereinfachung). – Marvin

Antwort

7

Es ist kein Fehler. Es ist ein Feature :)

Wenn Sie sorgfältig in Ihrer IDE schauen, wird es Ihnen sagen, dass der 2. und 3. Aufruf von getBoolean() immer falsch sind, aber nicht der erste.

Idea nimmt (in diesem Fall falsch) an, dass Ihre Methode, die parameterlos ist und "get" ... aufgerufen wird, immer den gleichen Wert zurückgibt.

Wenn das der Fall wäre und der erste Aufruf wahr wäre, würde der andere nie aufgerufen werden (wegen der Rückkehr).

Wenn der erste Aufruf falsch war, wären es auch die anderen.

IDEA versucht smart zu sein w.r.t. gute Programmierpraktiken, aber es ist nicht unfehlbar.

Wenn Sie Ihre Methode ändern Parameter zu haben (oder umbenennen, damit es wie ein Getter sieht nicht)

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

Die Warnungen gehen weg (auch wenn Sie alle Zeiten mit dem gleichen Argument aufrufen) .

(Beachten Sie, dass, auch wenn es ein Getter war, wenn es es ist immer noch falsch, wie es in einer Multithread-Umgebung ändern kann! Für ein nicht-letztes Feld ist)

+0

Interessant. Das wäre in der Tat ein Fehler, denn das Aufrufen einer Methode ohne Parameter bedeutet nicht, dass es keine Nebenwirkungen oder unterschiedliche Rückgabewerte geben kann. –

+0

Sogar eine Änderung an 'public static boolean getBoolean (int ... x) {' macht hier den Trick (was die Notwendigkeit, die Aufrufe ebenfalls zu ändern, nicht beinhaltet). –

+0

@MathiasBader Sie haben Recht. Ich habe es verklärt: es geht darum, es als Getter zu lesen. Siehe aktualisierte Antwort (Hinweis: Es ist immer noch falsch, es kann in einer Multithread-Umgebung sogar als Getter stummgeschaltet werden !, aber es sollte in den meisten Fällen nicht passieren) IDEA tut es am besten, aber es ist nicht perfekt. –

1

IDEA denkt, dass der Aufruf getBoolean() nicht geändert wird, wenn es für das zweite (oder dritte Mal) aufgerufen wird. Normalerweise, wenn Sie den gleichen Wert zurückgeben, könnte der zweite Anruf nie erreicht werden. Deshalb hebt IDEA es hervor.

0

In meinem Fall, wenn ich Sie MY_ACTUAL_CLASS_NAME verwenden. getBoolean() beklagt sich nicht (da die Methode statisch ist). Vielleicht liegt es daran, dass IntelliJ Idea keine statische Berechnung berücksichtigt (ein möglicher Fehler hier).