- 此问题在此处已有答案**:
(18个答案)
六年前关闭了。
我在一个应用程序上犯了一个编码错误,那是一个空引用测试。我花了几个小时才发现问题是什么,但我不明白的是为什么代码会这样。
String name = null;
String value = null;
if(name != null && value != null);
{
System.out.println("Values not null");
}
if语句以;
结尾,这是我的错误,即使很明显两个值都是null,Values not null
还是被打印出来了,有人能解释一下为什么吗?
9条答案
按热度按时间wwodge7n1#
这个分号结束了一个语句(空语句),因此编译器会将代码转换为如下形式:
换句话说,如果
if
表达式是true
,它将执行空代码块。然后,无论if
是否为真,运行库都将继续运行包含System.out
的代码块。空语句仍然是一个语句,因此编译器接受您的代码。另一个可能发生这种错误的地方:
甚至更糟(无限循环):
我花了几个小时才发现问题所在
好的IDE应该立即警告您这样的语句,因为它可能永远都不正确(就像某些语言中的
if(x = 7)
)。zqdjd7g92#
;
终止语句。相当于:
下面的代码只是一个代码块。
j13ufse23#
相当于:
vsaztqbk4#
这里你的if语句因为分号而结束了...
因此,它就像一个
empty
if块:-因此,下一个代码将成为初始化程序块:-
因为它是一个初始化程序块..无论
if
条件的计算结果是什么,它都会被执行。o2gm4chl5#
这是标准的语法规则。分号终止语句,但语句可能为空,因此这些行:
相当于:
下面的
{ ... }
语句看起来就像任何其他代码块一样,并且将始终被执行,因为if
语句到那时已经完成。xnifntxz6#
您的代码等效于:
ylamdve67#
分号结束语句,从而将if从后面的块中分离出来。
请注意,块可以是任意的。
if(true);
这是有效的,它什么也不做。允许这样做的语言相当愚蠢,尽管IDE应该用警告之类的东西来捕捉这些问题。06odsfpq8#
一个空的
;
是一个完整的空语句。在if之后,当if
为true时,必须正好有一个将执行的语句。在您的case中执行的一个语句是空语句。您可以使用{statement; statement;...}
将多个语句组合为一个语句bis0qfac9#
要知道,条件语句不一定要跟在左括号和右括号后面,如果你只想在满足条件时执行一条语句,大多数语言都允许你直接发出括号。
意味着以下内容是完全有效的,例如:
从本质上讲,你的代码就是这样做的,除了你的单个语句被确定为
;
(是的,这被认为是一个语句)。你写的东西和: