Java中的if / else语句

时间:2013-08-19 05:21:48

标签: java

class if1
{

  public static void main(String args[])
  {
    int a = 100;
    if(a==100); //Expected a compile error but did not get one.    
  }    
}

我希望编译器发出错误,但令人惊讶的是它编译得很好。 编译器忽略“if”语句是否有任何要处理的语句的理由是什么。 为什么它不会像下面的情况那样抛出错误?

class if2
{

  public static void main(String args[])
  {
    int a = 100;
    if(a == 101) //Compiler complains here...
    else
    {
      System.out.println("in else");

    }
  }
}

在上面的陈述中,编译抱怨“if”子句没有任何要处理的东西。

有人可以告诉我为什么吗?

12 个答案:

答案 0 :(得分:7)

if(a==100); //Expected a compile error but did not get one.

没有编译器错误,因为它被假定为空if块,因为它以分号(;)

终止
if(a == 101) //Compiler complains here...

这是一个不完整的if块,if中应该至少有一个语句,否则它应该由semicolon(;)终止,如上所述。因为if不完整所以其他对编译器也没有任何意义。

答案 1 :(得分:2)

首先有一个陈​​述;

 if(a == 101)
 ; // Hence there is no compile time error.

但是在第二个你没有声明。这是一个空座。

对于第二个陈述,你必须给它一个块。这样的事情: -

if(a == 101)
{
}

if(a == 101);

答案 2 :(得分:2)

好的,按照这种方式,你的第一个陈述相当于:

if (a == 10)
    ;   // Here you have one statement, but that's an empty statement.

所以,你确实有一个陈述,虽然是空的。所以,编译器就可以了。只是放一个分号是一种写空块的方法,没有花括号。所以,上面的if块实际上相当于:

if (a == 10) { }

在2 nd 案例中,

if (a == 10)
    // No statement here

编译器需要在if块后面找到一个它找不到的语句。

答案 3 :(得分:1)

sytax存在问题。 java支持if-elseif的指定语法。

if(a==100); // Empty if block
if(a==100)  // if block following with single statement
  System.out.println("a: "+a);

两者都是有效的if声明。

对于案例if-else -

if(a==100)
   System.out.println("a: "+a);
else
   System.out.println("else ");
or    
if(a==100){
   System.out.println("a: "+a);
}else{
   System.out.println("else ");
}

这两个都有效。但是

if(a == 101) 
else{...} 

这个没有效,因为if语句没有正确的结尾。

答案 4 :(得分:0)

没有if的{​​{1}}语句允许“then”子句为空;带有else的{​​{1}}语句不会。

Java语言规范(§14.5 Statements)中详细解释了其原因:

  

与在C和C ++中一样,Java编程语言的if语句遭受所谓的“悬空if问题”,这种错误的格式化示例说明了这一点:

else
  

问题是外部else语句和内部if (door.isOpen()) if (resident.isVisible()) resident.greet("Hello!"); else door.bell.ring(); // A "dangling else" 语句都可能拥有if子句。在这个例子中,有人可能会猜测程序员希望if子句属于外部else语句。

     

Java编程语言,如C和C ++以及它们之前的许多编程语言,任意地规定else子句属于它可能属于的最内层if。此规则由以下语法捕获:

     

...

     

语句因此在语法上分为两类:那些可能以else语句结尾且没有if子句(“短语句”)的语句和那些肯定不会的语句。

     

只有明确不以短if语句结尾的语句可能会在具有else子句的else语句中的关键字if之前显示为直接子语句。

     

这个简单的规则可以防止“悬空”的问题。具有“无短else”限制的语句的执行行为与没有“无短if”限制的相同类型语句的执行行为相同; 区别仅仅是为了解决句法难度。

答案 5 :(得分:0)

if(a==100); //Expected a compile error but did not get one.

这完全有效(尽管没有任何用处)。你是说变量等于100什么都不做。以上相当于

if(a==100){}

但是

if(a == 101) //Compiler complains here...

else
{
 System.out.println("in else");

}

在上面的情况下,你有一个悬在中间的地方。 If-else是一个构造,必须在一起(如果语句可以是独立的)。从逻辑上讲,如果没有,那为什么会有其他的呢。

答案 6 :(得分:0)

有sytax错误。 java支持if-else和if。

的指定语法
     if(a==100);

在语句之后没有分号(;)因此它被分号终止

if(a==100)
System.out.println("a: "+a);
else
 {
 System.out.println("in else");

 }

此代码将被执行。

答案 7 :(得分:0)

if(a == 101)这里你得到错误,因为这不是一个声明。你必须把(;)。 没有像if(a == 101);

这样的问题代码

我们可以使用if语句做这样的事情。

 if(a==2)
 System.out.println("This is correct"); 

所以我们也可以按如下方式使用

 if(a==0)
  ;

但你不能这样做,因为你必须把(;)

if(a==2)
System.out.println("This is correct")

然后也无效

if(a==2)

答案 8 :(得分:0)

c-heritage语言允许一个空语句,这使得表单的for循环成为可能:

for(/*initialization*/;/*iteration*/;/*condition*/){}

这允许程序员可选地在初始化时运行代码(例如对于局部变量),迭代(递增/递减值等),最后测试循环将中断的条件。

因为这是可能的,所以也可以使用空语句。

;
;;
if(false);
for(;;);

等。都是合法的。

答案 9 :(得分:0)

根据Java Language Specification空语句(分号本身)是一个完全合法的语句,可以在允许语句的任何地方使用。你的第一个案例

if (a==100);

就是这样。第二种情况:

if (a==100)
else { . . . }

缺少if分支所需的语句。 (参见JLS specification of the if statement syntax。)

答案 10 :(得分:0)

simicolon是空的陈述。写;{}非常相似。它什么都不做。编译器期望if条件之后的语句。所以在if条件之后立即有一个else会给你一个编译错误,但是有一个语句(包括空语句)不会。

答案 11 :(得分:0)

char charVar = ’z’;

写一个if语句,如果变量包含a,则条件为true,然后告诉用户变量的值为a。