为什么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");