2012-10-07 6 views
12

Ich machte einen Codefehler während der Arbeit an einer Anwendung, es war ein Test für Null-Referenz. Ich brauchte Stunden um herauszufinden, was das Problem war, aber was ich nicht verstehe ist, warum der Code sich so verhielt.Warum Java-If-Anweisung fehlschlagen, wenn es in Semikolon endet

String name = null; 
String value = null; 

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

Die if-Anweisung mit ; beendet, das war mein Fehler und die Values not null wurde auch gedruckt, wenn es offensichtlich ist, dass beiden Werte Null sind. Kann jemand erklären warum?

Antwort

14

Dieses Semikolon beendet eine Anweisung (eine leere), so dass Ihr Code durch den Compiler zu so etwas wie dies übersetzt:

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

In Mit anderen Worten, wenn if Ausdruck true ist, führt es einen leeren Codeblock aus. Dann, egal ob if wahr war oder nicht, läuft die Laufzeit und führt den Block mit System.out. Leere Anweisung ist immer noch eine Anweisung, daher akzeptiert der Compiler Ihren Code.

Ein weiterer Ort, an dem ein solcher Fehler passieren kann:

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

oder noch schlimmer (Endlosschleife):

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

Es dauerte Stunden, um herauszufinden, was das Problem

war

Gute IDE sollte Sie sofort über solche Aussage warnen, da es wahrscheinlich nie c ist orrect (wie if(x = 7) in einigen Sprachen).

+0

i Netbeans verwendet, aber es hat mich nicht warnen. –

+0

@UchennaNwanyanwu: kann jemand in Eclipse testen? Nur neugierig ... –

+0

@TomaszNurkiewicz .. Eine IDE wird Sie nicht davor warnen .. Es gilt nicht als falsche Verwendung von wenn .. –

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

entspricht:

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

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

Hier Ihre if-Anweisung aufgrund Semikolon abgeschlossen wurde ...

Also, es ist wie ein empty wenn Block: -

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

So Ihren nächsten Code ein wird Initializer Block: -

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

Da es ein Initialisierungsblock ist .. Es wird immer ausgeführt, egal was Ihre if Bedingung ausgewertet zu ..

1

Es ist die Standard Grammatik Regeln.Semikolons Aussagen beenden, aber Aussagen können leer sein, so dass diese Linien:

if (...); 
{ 
} 

gleichwertig sind:

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

{ 
    ... 
} 

Die folgende { ... } Anweisung sieht genauso aus wie jeder andere Code-Block, und wird immer dann ausgeführt werden, weil die if Anweisung bis dahin erledigt ist.

1

Ihr Code entspricht:

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

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

; beendet die Aussage.

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

entspricht:

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

Und der folgende Code ist einfach ein Code-Block.

1

Das Semikolon beendet die Anweisung und löst damit den if vom folgenden Block.

Beachten Sie, dass Blöcke beliebig sein können.

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

if(true); Dies gilt, und es tut nichts. Die Sprache, die dies erlaubt, ist ziemlich dumm, obwohl IDEs dieses Problem mit Warnungen und ähnlichem abfangen sollten.

0

Eine bare ; ist eine ganze leere Aussage. Nach dem if muss es genau eine Anweisung geben, die ausgeführt wird, wenn if wahr ist. Die eine Anweisung, die in Ihrem Fall ausgeführt wird, ist die leere Anweisung. Sie können mehrere Anweisungen mit {statement; statement;...}

0

kombinieren. Verstehen, dass bedingte Anweisungen nicht immer mit öffnenden und schließenden Klammern folgen müssen. In den meisten Sprachen können Sie einfach die geschweiften Klammern ausgeben, wenn Sie nur eine einzelne Anweisung ausführen möchten, wenn die Bedingungen der Bedingung erfüllt sind.

Bedeutung, dass die folgende vollständig gültig ist, zum Beispiel:

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

Im Wesentlichen Ihr Code tut genau dies. Außer Ihrer einzigen Aussage wird bestimmt, ; zu sein (ja, das ist eine Aussage).

Was Sie geschrieben hat, ist die gleiche wie:

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

System.out.println("Values not null"); 
Verwandte Themen