为什么没有编译时错误?奇怪 - Java

时间:2011-09-23 02:01:19

标签: java coding-style syntax if-statement

我有一个if语句检查一些值,并遇到了一个奇怪的错误(不确定!)。我的代码在语法上是不正确的,结果它产生了错误的结果,但是eclipse在编译时没有引发任何错误。为什么我的下面代码有效?

if((this.trackPointList.get(point).getTurnOutId().equals(seg.getSegRef().getTurnOut())) && seg.getSegRef().getKind().equals("arc")); // <---- See here I have semicolon
    {
       ... code to run ...
    }

上面的代码只检查第一个条件并忽略seg.getSegRef().getKind().equals("arc")但我想这应该在编译时引发一个问题,我是对的吗?我的逻辑工作一旦我通过逐行浏览调试它并找到了这个分号。如果有人可以解释,如果它是有效的语法,我将不胜感激。

启发我,拜托!

5 个答案:

答案 0 :(得分:11)

;使得Java认为if条件的主体已完成,即使其前面没有其他代码也是如此。实际上,if语句中的代码已执行,但由于;存在,因此不存在实体。

{ ...code to run...}只是一个执行的代码块,并且该块内部声明的任何内容在块外都不可见。它总是在这里运行,因为它不是if块的一部分。

编辑:这是关于{ }块的另一个堆栈溢出问题:What do curly braces in Java mean by themselves?

答案 1 :(得分:2)

代码在语法上是正确的。您可以编写没有大括号的ifs,例如:

if(condition) statement;

空语句也有效。例如,此代码有效:

int a = 0;;
;;;

所以空的if也是有效的,尽管它没有多大意义:)

if(condition);

答案 2 :(得分:2)

if语句后跟分号称为“空if语句”。 它很少有用,但它在语法上是合法的。

你可以写这样的东西

if ( doSomethingThatReturnsABoolean() )
   ;  // Empty statement
else
   doSomeOtherThing()

但最好写

if ( !doSomethingThatReturnsABoolean() )
   doSomeOtherThing()

关于您的观察,只检查第一个条件: 如果第一个条件返回false,则不会检查第二个条件,因为

(false && secondCondition)

总是等于false,因此secondCondition的值无关紧要。

答案 3 :(得分:1)

;语句之后的if(..)表示当if(..)计算结果为true时有条件执行的空语句。 { .. }表示始终以其自己的范围执行的代码块。

如果由于short-circuit evaluation导致第一个条件为假,则可以忽略第二个条件。

答案 4 :(得分:1)

if(condition);相当于if(condition){}

for loop&amp; while loop

for(;condition;);相当于for(;condition;){}

while(condition);相当于while(condition){}