我有一个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")
但我想这应该在编译时引发一个问题,我是对的吗?我的逻辑工作一旦我通过逐行浏览调试它并找到了这个分号。如果有人可以解释,如果它是有效的语法,我将不胜感激。
启发我,拜托!
答案 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){}