12

アプリケーションの作業中にコーディング ミスを犯しました。それは null 参照のテストでした。問題が何であるかを発見するのに何時間もかかりましたが、理解できないのは、コードがこのように動作した理由です。

String name = null;
String value = null;

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

if ステートメントは で終了しました;。これは私の間違いであり、Values not null両方の値が null であることが明らかな場合でも出力されました。誰でも理由を説明できますか?

4

9 に答える 9

14

このセミコロンはステートメント (空のステートメント) を終了するため、コードはコンパイラによって次のように変換されます。

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

つまり、ifexpression がtrueの場合、空のコード ブロックを実行します。次に、ifが true であるかどうかに関係なく、ランタイムは続行し、 を含むブロックを実行しますSystem.out。空のステートメントはステートメントであるため、コンパイラはコードを受け入れます。

このような間違いが発生する可能性がある別の場所:

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

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

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

問題が何であるかを発見するのに何時間もかかりました

if(x = 7)優れた IDE は、おそらく決して正しくない (いくつかの言語のように) そのようなステートメントについて、すぐに警告するはずです。

于 2012-10-07T19:44:08.223 に答える
5

;ステートメントを終了します。

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

次と同等です。

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

そして、次のコードは単なるコードのブロックです。

于 2012-10-07T19:44:45.487 に答える
2
if(name != null && value != null);
{
    System.out.println("Values not null");
}

次と同等です。

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

{
    System.out.println("Values not null");
}
于 2012-10-07T19:43:53.210 に答える
2
if(name != null && value != null);

ここで、セミコロンのためにifステートメントが終了しました...

したがって、これはemptyif ブロックのようなものです: -

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

したがって、次のコードはInitializer ブロックになります: -

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

これは初期化ブロックifであるため..条件の評価に関係なく常に実行されます..

于 2012-10-07T19:44:08.363 に答える
1

それは標準的な文法規則です。セミコロンはステートメントを終了しますが、ステートメントは空である可能性があるため、これらの行は次のとおりです。

if (...);
{
}

以下と同等です。

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

{
    ...
}

次の{ ... }ステートメントは、他のコード ブロックと同じように見え、常に実行されifます。

于 2012-10-07T19:44:24.380 に答える
1

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

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

System.out.println("Values not null");
于 2012-10-07T19:44:38.670 に答える
1

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

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

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

if(true);これは有効であり、何もしません。これを可能にする言語はかなりばかげていますが、IDE はこれらの問題を警告などでキャッチする必要があります。

于 2012-10-07T19:45:16.877 に答える
0

条件ステートメントは、必ずしも左中括弧と右中括弧の後に続く必要はないことを理解してください。ほとんどの言語では、条件が満たされたときに単一のステートメントを実行したいだけであれば、単純に中括弧を発行することができます。

たとえば、以下は完全に有効であることを意味します。

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");
于 2012-10-07T19:47:52.257 に答える
0

1 つの裸;は、まったく空のステートメントです。if の後には、が true のときに実行されるステートメントが 1 つだけ存在する必要がありifます。あなたの場合に実行される 1 つのステートメントは、空のステートメントです。複数のステートメントを 1 つに組み合わせることができます。{statement; statement;...}

于 2012-10-07T19:46:34.360 に答える