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

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

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

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

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

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

换句话说,如果expression为true ,则执行空代码块。 然后,无论是否为真,运行时都会继续并运行包含System.out的块。 空语句仍然是一个语句,因此编译器接受您的代码。

另一个可能发生这种错误的地方:

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

甚至更糟(无限循环):

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

我花了几个小时才发现问题所在

好的IDE应该立即警告你这样的声明,因为它可能永远不会正确(比如if(x = 7)在某些语言中)。

; 终止声明。

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

相当于:

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

以下代码只是一段代码。

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

相当于:

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

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

所以,它就像一个empty if块: –

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

所以你的下一个代码成为初始化程序块 : –

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

因为它是一个初始化程序块 ..无论你的if条件被评估为什么,它都将被执行。

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

 if (...); { } 

相当于:

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

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

您的代码相当于:

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

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

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

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

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

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

理解条件语句不必总是遵循开括号和结束括号。 如果您只想在满足条件条件时执行单个语句,大多数语言都允许您简单地发出大括号。

意味着以下内容完全有效,例如:

 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");