这个问题在这里已经有答案了:
“if”语句结尾的分号(18个答案)
四年前关门了。
我在处理应用程序时犯了一个编码错误,这是对空引用的测试。我花了几个小时才发现问题所在,但我不明白的是为什么代码会这样。
String name = null;
String value = null;
if(name != null && value != null);
{
System.out.println("Values not null");
}
if语句以结束 ;
,那是我的错误 Values not null
即使很明显两个值都为空,也会打印。有人能解释为什么吗?
9条答案
按热度按时间bis0qfac1#
一个光秃秃的
;
完全是一句空话。在if之后,必须正好有一条语句在if
这是真的。在您的案例中执行的一个语句是空语句。您可以将多个语句合并为一个语句{statement; statement;...}
xwbd5t1u2#
这是标准的语法规则。分号终止语句,但语句可能为空,因此这些行:
相当于:
以下
{ ... }
语句看起来就像任何其他代码块,并且总是被执行,因为if
声明到那时就完成了。m4pnthwp3#
这个分号结束了一个语句(一个空的语句),因此编译器会将您的代码翻译成如下形式:
换句话说,如果
if
表达式是true
,它执行空代码块。那么不管if
如果为true或false,则运行时继续并运行包含System.out
. 空语句仍然是一个语句,因此编译器接受您的代码。另一个可能发生这种错误的地方:
甚至更糟(无限循环):
我花了几个小时才发现问题所在
好的ide应该立即警告您这样的语句,因为它可能永远都不正确(比如
if(x = 7)
在某些语言中)。cngwdvgl4#
您的代码相当于:
j2qf4p5b5#
要明白,条件语句不必总是跟在大括号后面。如果只想在满足条件的条件下执行一条语句,大多数语言都允许您简单地发出大括号。
意味着以下是完全有效的,例如:
基本上,您的代码就是这样做的。除了你的一句话
;
(是的,这被认为是一种陈述)。你写的和:
lztngnrs6#
;
终止语句。相当于:
下面的代码只是一个代码块。
lh80um4z7#
相当于:
lqfhib0f8#
如果你的陈述因为分号而结束了。。。
所以,它就像一个
empty
如果阻止:-所以你的下一个代码就变成了初始化程序块:-
因为它是一个初始化程序块。。无论你做什么,它都会被执行
if
条件评估为。。kognpnkq9#
分号结束语句,从而将if从下面的块中分离出来。
请注意,块可以是任意的。