2012-10-07 30 views
12

Podczas pracy nad aplikacją popełniłem błąd podczas kodowania, który był testem dla zerowego odwołania. Zajęło mi godziny, aby odkryć, co to jest problem, ale nie rozumiem, dlaczego kod zachowywał się w ten sposób.Dlaczego instrukcja java if kończy się niepowodzeniem, gdy kończy się na średniku

String name = null; 
String value = null; 

if(name != null && value != null); 
{ 
    System.out.println("Values not null"); 
} 

if zakończył ;, to był mój błąd i Values not null została wydrukowana nawet, gdy jest oczywiste, że obie wartości są nieważne. Czy ktoś może wyjaśnić dlaczego?

Odpowiedz

14

ten średnik kończy oświadczenie (pusty on), dzięki czemu kod jest tłumaczone przez kompilator, aby coś takiego:

if(name != null && value != null) 
{ 
    //nothing here 
} 
{ 
    System.out.println("Values not null"); 
} 

W inne słowa, jeśli wyrażenie if to true, wykonuje pusty blok kodu. Niezależnie od tego, czy if było prawdziwe, czy nie, środowisko wykonawcze kontynuuje i uruchomi blok zawierający System.out. Pusta instrukcja to nadal instrukcja, więc kompilator akceptuje twój kod.

Innym miejscem gdzie taka pomyłka może się zdarzyć:

for(int i = 0; i < 10; ++i); 
{ 
    System.out.println("Y U always run once?"); 
} 

lub nawet gorzej (nieskończona pętla)

boolean stop = false; 
while(!stop); 
{ 
    //... 
    stop = true; 
} 

Zajęło mi godziny, aby odkryć, co problem był

Dobry IDE powinien natychmiast ostrzec Cię przed takim stwierdzeniem, ponieważ prawdopodobnie nigdy nie będzie orrect (jak if(x = 7) w niektórych językach).

+0

użyłem NetBeans ale nie mnie ostrzec. –

+0

@UchennaNwanyanwu: czy ktoś może testować w Eclipse? Po prostu ciekawy ... –

+0

@TomaszNurkiewicz .. IDE nie ostrzeże Cię o tym .. Nie jest to uważane za nieprawidłowe użycie, jeśli .. –

2
if(name != null && value != null); 
{ 
    System.out.println("Values not null"); 
} 

odpowiada:

if(name != null && value != null){} 

{ 
    System.out.println("Values not null"); 
} 
2
if(name != null && value != null); 

tutaj swoje if ale skończył z powodu średnikiem ...

Tak, to jest właśnie jak empty jeśli blok: -

if(name != null && value != null) {} 

Więc następny kod staje się Initializer blok: -

{ 
    System.out.println("Values not null"); 
} 

Ponieważ jest to blok inicjujący .. Będzie on wykonywany zawsze bez względu na to, jaki jest twój stan if oceniany na ..

1

To standardowe zasady gramatyki.Średniki zakończyć wypowiedzi, ale wypowiedzi może być pusty, więc te linie:

if (...); 
{ 
} 

są równoważne:

if (...) /* do nothing */ ; 

{ 
    ... 
} 

Poniższy { ... } oświadczenie wygląda po prostu jak każdy inny blok kodu, i zawsze będą wykonywane, ponieważ instrukcja if jest już wykonana.

1

Twój kod jest równoważny:

if(name != null && value != null) { 
    // empty code block 
} 

System.out.println("Values not null"); 
5

; kończy oświadczenie.

if(name != null && value != null); 

odpowiada:

if(name != null && value != null) 
{ 
} 

I następujący kod jest po prostu blok kodu.

1

Półkolem kończy instrukcję, a tym samym odłącza się od następnego bloku.

Należy pamiętać, że bloki mogą być dowolne.

{ 
System.out.println("This is some code"); 
} 

if(true); To jest ważne i nie robi nic. Język, który na to pozwala, jest dość głupi, chociaż IDE powinno wychwycić ten problem z ostrzeżeniami i tym podobnymi.

0

Jeden pusty ; to całe puste oświadczenie. Po tym, czy musi być dokładnie jedna instrukcja, która zostanie wykonana, gdy if jest prawdziwa. Jedno zdanie, które jest wykonywane w twoim przypadku, jest pustym stwierdzeniem. Możesz połączyć więcej instrukcji z jednym z {statement; statement;...}

0

Zrozum, że instrukcje warunkowe nie zawsze muszą być zgodne z klamrami otwierającymi i zamykającymi. Większość języków pozwala po prostu wysyłać klamry, jeśli chcesz wykonać pojedynczą instrukcję tylko wtedy, gdy spełnione są warunki warunku.

ten sposób, że po to całkowicie poprawny, na przykład:

if (var1 == true && var2 == true) var3 = 'both true'; 
{ 
    //block here, this is always executed regardless of the statements outcome 
} 

Zasadniczo kod robi dokładnie to. Poza tym, że twoje pojedyncze oświadczenie jest określone jako ; (tak, jest to uważane za oświadczenie).

co napisałeś jest taka sama, jak:

if(name != null && value != null) { 
    // do nothing 
} 

System.out.println("Values not null"); 
Powiązane problemy