为什么java if语句在以分号结尾时失败

时间:2012-10-07 19:42:03

标签: java

我在处理应用程序时犯了编码错误,这是对空引用的测试。我花了几个小时来发现问题是什么,但我不明白的是代码表现的原因。

String name = null;
String value = null;

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

if语句以;结束,这是我的错误,即使很明显两个值都为空,也会打印Values not null。任何人都可以解释原因吗?

9 个答案:

答案 0 :(得分:14)

这个分号结束一个语句(一个空的),所以编译器将你的代码翻译成这样的代码:

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应该立即警告你这样的声明,因为它可能永远不会正确(比如某些语言中的if(x = 7))。

答案 1 :(得分:5)

;终止声明。

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

相当于:

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

以下代码只是一段代码。

答案 2 :(得分:2)

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

相当于:

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

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

答案 3 :(得分:2)

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

这里你的if语句由于分号而完成......

所以,它就像一个empty if block: -

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

因此,您的下一个代码将成为初始化程序块: -

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

因为它是初始化程序块 ..无论您的if条件评估为什么,它都会被执行..

答案 4 :(得分:1)

这是标准的语法规则。分号终止语句,但语句可能为空,所以这些行:

if (...);
{
}

相当于:

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

{
    ...
}

以下{ ... }语句看起来就像任何其他代码块一样,并且将始终执行,因为那时if语句已完成。

答案 5 :(得分:1)

您的代码相当于:

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

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

答案 6 :(得分:1)

分号结束语句,从而将if从以下块中分离出来。

请注意,块可以是任意的。

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

if(true);这是有效的,它什么都不做。允许这种情况的语言非常愚蠢,尽管IDE应该通过警告等来解决这些问题。

答案 7 :(得分:0)

一个裸;是一个完整的空语句。在if为真之后,如果必须有一个语句将被执行。在您的情况下执行的一个语句是空语句。您可以将更多语句与{statement; statement;...}

组合使用

答案 8 :(得分: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");