我在处理应用程序时犯了编码错误,这是对空引用的测试。我花了几个小时来发现问题是什么,但我不明白的是代码表现的原因。
String name = null;
String value = null;
if(name != null && value != null);
{
System.out.println("Values not null");
}
if语句以;
结束,这是我的错误,即使很明显两个值都为空,也会打印Values not null
。任何人都可以解释原因吗?
答案 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");