2012-10-07 3 views
12

アプリケーションで作業中にコーディングミスを犯しました。これはnull参照のテストでした。問題が何であるかを知るには数時間かかりましたが、私が理解できないのはコードがこのように動作した理由です。java文がセミコロンで終了するとエラーになるのはなぜですか?

String name = null; 
String value = null; 

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

if文が;で終わった場合、それは私の間違いだったとValues not nullが、両方の値がnullであることは明らかである場合でも、印刷しました。なぜ誰かが説明できますか?

答えて

14

あなたのコードは、このような何かをコンパイラで翻訳されていますので、このセミコロンは、文の(空1)を終了します。では

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

つまり、ifの式がtrueの場合、空のコードブロックが実行されます。その後、ifが真であるかどうかにかかわらず、ランタイムは進行し、System.outを含むブロックを実行します。空文はまだステートメントなので、コンパイラはコードを受け入れます。

、このようなミスが発生する可能性が別の場所:

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

またはさらに悪い(無限ループ):

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

それは問題が

たものを発見するために私に時間を要しました

良いIDEは、おそらくこのようなことについて警告する必要がありますorrect(一部の言語ではif(x = 7)など)。ここで

+0

私は、NetBeansを使用しますが、それは私に警告しませんでした。 –

+0

@UchennaNwanyanwu:誰でもEclipseでテストできますか?ちょうど興味があります... –

+0

@TomaszNurkiewicz .. IDEはこれについてあなたに警告しません..もしかしたら誤った使用とはみなされません。 –

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

と同等です:

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

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

あなたの文がブロック場合、それはちょうどemptyのようなものです、だから、原因セミコロン...

に終わってしまった場合: -

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

だから、あなたの次のコードになります初期化子ブロック: -

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

イニシャライザブロックです。あなたのifの状態が何であるかに関係なく、常に実行されます。

1

これは標準の文法規則です。セミコロンは、文を終了しますが、ステートメントが空の場合もあるので、これらの行:、

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

{ 
    ... 
} 

{ ... }文はちょうど、他のコードブロックのように見える、と常に実行されます。

if (...); 
{ 
} 

は同等ですこれまでにステートメントが完了しているためです。

1

あなたのコードは同等です:

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

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

;は文を終了します。

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

は、と等価である:

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

、次のコードは、単にコードのブロックです。

1

セミコロンはステートメントを終了し、したがってifを次のブロックから切り離します。

ブロックは任意であることに注意してください。

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

if(true);これは有効であり、何もしません。これを可能にする言語はかなり愚かですが、IDEは警告などでこれらの問題を把握する必要があります。

0

裸の1本;は、完全な空文です。この後、ifが真のときに実行される文が1つだけある必要があります。あなたのケースで実行される1つのステートメントは、空のステートメントです。 1つに多くのステートメントを組み合わせることができます。{statement; statement;...}

0

条件文が常に中カッコの前後に続く必要はないことを理解してください。ほとんどの言語では、条件の条件が満たされたときに1つのステートメントだけを実行したい場合に、中括弧を単に出すことができます。以下は、例えば、完全に有効であることを意味

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

基本的に、あなたのコードは、これは正確に行います。あなたの単一の声明が;と決定されていることを除いて(はい、これは声明とみなされます)。

あなたが書いたことと同じである:

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

System.out.println("Values not null"); 
関連する問題