2015-11-04 34 views
6

Poniższy program na IntelliJIntelliJ - Komunikat ostrzegawczy nie pojawi się za stan i> = 2, gdy znany jest

public static void main(String[] args) { 
    int i = 0; 
    if (i <= 2) { 
     System.out.println("ok"); 
    } 
} 

ostrzega mnie "Stan 'i < = 2' jest zawsze 'true'". Jeśli zmienię warunek na i > 2, otrzymam "Warunek" i> 2 "jest zawsze" fałszem "". To samo z i == 2.

Ale jeśli zamieniam to na i >= 2, nie mam żadnych ostrzeżeń.

Dlaczego w ostatnim przypadku IntelliJ nie ostrzega mnie, że ten warunek jest zawsze fałszywy?

Używam IntelliJ 14.1.5, a użyty kompilator to javac w wersji 1.8.0_51.

enter image description here

+5

wydaje się winy w realizacji IntelliJ nie emisyjnej Java. Polecam zgłosić to do JetBrains. –

+3

Nie sądzę, że istnieje jakiś głęboki powód. To musi być po prostu błąd, ale jest dość dziwny. Jeśli zrobię "int i = 5; jeśli (i <= 2) 'nie otrzymam ostrzeżenia. –

+0

Prawdopodobnie https://youtrack.jetbrains.com/issue/IDEA-146950 –

Odpowiedz

3

jak Paul Boddington powiedział w komentarzu, to w rzeczywistości coś, czego JetBrains zapomniał wprowadzić w swoim algorytmie, który został fixed a few days ago.

Przed:

if (opSign == LT && comparedWith <= rangeMin) return alwaysFalse(instruction, runner, memState); 
if (opSign == LT && comparedWith > rangeMax) return alwaysTrue(instruction, runner, memState); 
if (opSign == LE && comparedWith >= rangeMax) return alwaysTrue(instruction, runner, memState); 

if (opSign == GT && comparedWith >= rangeMax) return alwaysFalse(instruction, runner, memState); 
if (opSign == GT && comparedWith < rangeMin) return alwaysTrue(instruction, runner, memState); 
if (opSign == GE && comparedWith <= rangeMin) return alwaysTrue(instruction, runner, memState); 

Po:

if (opSign == LT && comparedWith <= rangeMin) return alwaysFalse(instruction, runner, memState); 
if (opSign == LT && comparedWith > rangeMax) return alwaysTrue(instruction, runner, memState); 
if (opSign == LE && comparedWith >= rangeMax) return alwaysTrue(instruction, runner, memState); 
if (opSign == LE && comparedWith < rangeMin) return alwaysFalse(instruction, runner, memState); 

if (opSign == GT && comparedWith >= rangeMax) return alwaysFalse(instruction, runner, memState); 
if (opSign == GT && comparedWith < rangeMin) return alwaysTrue(instruction, runner, memState); 
if (opSign == GE && comparedWith <= rangeMin) return alwaysTrue(instruction, runner, memState); 
if (opSign == GE && comparedWith > rangeMax) return alwaysFalse(instruction, runner, memState); 

Odpowiedniego wydania: https://youtrack.jetbrains.com/issue/IDEA-146950

1

ten zwrócił moją uwagę około tydzień temu, więc jego śmiesznym widziałem go tu wkrótce po zbyt. Zajrzałem do tego, a działo się to już tak wcześnie, jak Intellij 10. W trakcie wszystkich aktualizacji było kilka poprawek, ale problem nie został wyraźnie rozwiązany.

Oto link, w którym Jetbrains odnosi się do błędu. Istnieje wiele przypadków. IDEA-84489

Jeśli jej przeszkadza Ci, spróbuj tłumienia ostrzeżenie poprzez Alt + Enter podczas gdy kursor znajduje się nad nim i wybrać opcję, która mówi „stłumić dla ...”