java-'if'语句结尾的分号
今天,在搜索错误半小时之后,我发现可以在if语句后加上分号而不是代码,如下所示:
if(a == b);
// Do stuff
这基本上意味着无论a是否等于b,都可以完成这些工作,并且if语句毫无意义。 Java为什么不给我一个错误? 有什么情况会有用吗?
18个解决方案
83 votes
为什么会发生?
Java语言规范说:
空话
空语句不执行任何操作。
if(a == b){
;
}
空语句的执行总是正常完成
从本质上讲,这意味着您要在a == b时执行空语句
if(a == b);
你该怎么办:
此问题有两种主要解决方案:
通过使用代码格式化程序,可以避免空语句出现问题以及if(a == b){
;
}和}中的周围物品。您的空语句将更具可读性。
if(a == b){
;
}
您还可以检查用于静态代码分析的工具,例如:
FindBugs的
Checkstyle的
PMD
他们可以立即突出显示诸如此类的问题。
我建议将两种解决方案结合起来。
Marcin Szymczak answered 2019-10-01T14:34:33Z
28 votes
有什么情况会有用吗?
有用? 如“使代码更干净,更清晰,更快,更可维护”中所述? 一点也不。 这很可能是糟糕的,令人困惑的代码。
但这不一定是良性的。 由于引起副作用的方法,这样的语句可能会执行操作和/或更改状态,并由于操作员的短路而可选地评估那些方法。
if( a() && b() );
在这里,while(reader.read());或b()可能会做某事,而b()仅在a()为true时才会执行。
至于原因,我认为答案很简单,那就是偏离定义的预期行为(例如类似while(reader.read());的语句)比开发不良代码的开发人员更糟糕。
编写错误代码始终是可能的。 重申一下,几乎在任何情况下,这都是不好的代码。
Tim Medora answered 2019-10-01T14:35:39Z
19 votes
一个可能的用例:
if (a==b);
else {
// Do something
}
不好,但是可能。
不过,我确实认为Java规范应禁止使用空的if。
gefei answered 2019-10-01T14:36:21Z
11 votes
如果使用的是Eclipse,则可以警告您有关以下语句的信息:
nullptr answered 2019-10-01T14:36:49Z
7 votes
如果使用if语句,则在条件为true时将执行25501858958278666666之后的第一条语句。 如果在if(带花括号)之后有一个块,它将计入整个块。 如果没有块,则仅计算一条语句。 单个分号是一个空语句。 您还可以像这样从示例中编写代码:
if(a==b) {
;
}
André Stannek answered 2019-10-01T14:37:21Z
6 votes
自从存在更多语法糖来区分表达式和语句的时代以来,这是一个古老的遗留物。
基本上,逗号用作列表项分隔符,因此分号用作“语句列表”分隔符。 缺点是处理列表中的空项目和块中的空语句。
在项目列表中,Java使用显式关键字if,但是“空语句”只是一个空行。 允许存在空行是从C继承的传统的遗留物。
为什么呢 当您知道没有任何语句正在执行时,尤其是使用if语句时:因为某些if语句具有副作用:
int c;
if ((c = in.read()) != -1);
是的,这不是最好的例子,但是基本上它说从流中读取一个字节,什么也不做。 在某些情况下可能很有用,但是即使这个例子不是最好的,它也可以说明意图。 我们希望在不意外执行任何语句的情况下感受表达式的副作用。
Edwin Buck answered 2019-10-01T14:38:29Z
5 votes
我想不出有用的场合。 对于像这样的循环很有用
while(do something);
要么
for(init; do something; something else);
如果您在IDE中定期使用代码格式,则这些错误很明显。 一些IDE也将其突出显示为可能的错误。
Peter Lawrey answered 2019-10-01T14:39:09Z
4 votes
我会同意你的观点,对于人类来说这没有任何用处。 我怀疑它在那里,因为它简化了语言定义。 例如,这意味着if之后出现的事物与while之后出现的事物相同。
yshavit answered 2019-10-01T14:39:38Z
3 votes
为什么? 这是因为它对编译器编写者来说更容易。 在if(cond)之后,您无需特殊情况即可检查分号,并且具有允许
if (cond && maybeFunc())
;// Code here I want to ignore
即使允许这样做实际上是一个可怕的想法。 允许再添加一个案例来检查这一点比较容易。
Peter Mortensen answered 2019-10-01T14:40:18Z
2 votes
Java允许在任何允许语句块的地方使用空块。 我确信使所有块成为通用规则可以简化编译器。
我同意这主要是导致难以发现的错误的原因。 我总是在块的周围使用大括号,即使只有一条语句,但Java允许您在任何时候使用大括号创建一个块,因此使用大括号无法使您免于命运。 例如,我曾经浪费4个小时来尝试查找以下内容:
while (condition);
{
statement;
statement;
}
第一行结尾的分号是一个错字,偶然使while循环的语句块为空。 因为语法是有效的,所以程序已编译并可以正常运行,只是不是我想要的那样。 真的很难找到。
我可以想到一种情况,允许您有空块非常好,这是这样的:
if (condition1) {
do_action_1();
}
else if (condition2) {
//nothing really to do in this case
}
else if (condition3) {
do_action2();
}
else {
do_action3();
}
在上面的示例中,您希望能够分离出各种条件。 请记住,这些条件可能是重叠的,因此并非总是可以重新排列顺序。 如果其中一个条件确实不需要执行任何操作,那么Java允许您有一个空块就很好了。 否则,当您确实不希望做任何事情时,该语言将需要某种形式的“ noop”方法来使用。
我个人更喜欢显式的“ noop”语句-但这不是Java定义的方式。
AgilePro answered 2019-10-01T14:41:29Z
2 votes
仅供参考,关于可用性以及如果有这样的声明,它将产生或可能产生什么变化
考虑如下代码。
int a = 10;
if ((a = 50) == 50);
System.out.println("Value of a = " + a);
显然,在这种情况下,if语句确实更改了输出。 因此,这样的声明可以有所作为。
在这种情况下,这可能会有用或更好地说会对程序产生影响。
Mukul Goel answered 2019-10-01T14:42:26Z
1 votes
if(a==b)
println("a equals b");
如果只有一行要执行,则可以使用不带{}的IF语句,因此通过使用if(a==b);,您要说的是它们是否相等,执行并为空语句...因此它将什么也不做,然后返回到正常循环 ,位于IF块之外。
Matt Clark answered 2019-10-01T14:42:57Z
1 votes
jls的一些定义对此进行了解释(第14章):
块是陈述
如此处所述,EmptyStatement是EmptyStatement,而empty又是empty,即-Xlint:all。因此,在任何需要这些位置的地方,我们都可以插入-Xlint:empty。
如果子句
尽管EmptyStatement和EmptyStatement循环也是如此,但我将使用empty语句。 这些规则几乎相同。 -Xlint:all的语法描述可以在此处找到。
IfThenStatement:
if ( Expression ) Statement
IfThenElseStatement:
if ( Expression ) StatementNoShortIf else Statement
IfThenElseStatementNoShortIf:
if ( Expression ) StatementNoShortIf else StatementNoShortIf
所以我们可以在这里使用我们的块。
但是为什么它起作用;?
EmptyStatement被定义为EmptyStatement(链接),以及empty。因此,在有条件的代码段(例如-Xlint:all和循环)中,如果需要StatementNoShortIf或StatementNoShortIf或StatementNoShortIf,则可以用-Xlint:empty替换-Xlint:empty。
因此EmptyStatement可以工作。
为什么这没有给出错误?
很简单:如果发现无效的语法,java会给出一个错误。 但是EmptyStatement是完全有效的语法。 相反,如果使用适当的参数启动,则EmptyStatement会发出警告。 为此可以禁用/启用的警告的完整列表列出了警告名称empty。 因此,使用-Xlint:all或-Xlint:empty进行编译将对此产生警告。
您的IDE也应具有启用这种警告的选项。对于日食,请参阅@nullptr的答案。 在IntelliJ中,您可以按EmptyStatement,在搜索字段中输入EmptyStatement并启用警告(在图像中标记)
这甚至是做什么用的?
老实说,从简约的角度来看,它没有太多用处。 通常,有一种无需“不执行任何操作”命令即可完成工作的方法。 这是个人喜好问题,是否愿意使用
if( a() && b() );
要么
if( a() ) b();
在使用EmptyStatement的其他情况下也是如此。 在此主题上要考虑的重要一点是代码的可读性。 在某些情况下,使用no-op可使代码更具可读性。 另一方面,在某些情况下,使用EmptyStatement变得很难理解代码-上面的示例可以算作后来的IMO。
Paul answered 2019-10-01T14:45:32Z
0 votes
以分号结尾,
如果(A == B); 只需在单行中完成语句即可,这意味着忽略条件的结果并从下一行继续执行
这段代码很有用,另一方面有时会引入程序中的错误,例如,
情况1。
a = 5;
b = 3;
if(a == b);
print(“ a和b相等”);
情况2。
a = 5;
b = 5;
if(a == b);
print(“ a和b相等”);
会在屏幕上打印相同的输出...
Narayan Bhandari answered 2019-10-01T14:47:44Z
0 votes
我可以想到一个需要空语句的情况(不是针对if条件,而是针对while循环)。
当程序只想从用户那里得到明确的确认继续时。 当用户确认后的工作依赖于其他一些事项并且用户希望控制何时进行时,可能需要执行此操作。
System.out.println("Enter Y to proceed. Waiting...");
System.out.println("");
while(!(new Scanner(System.in).next().equalsIgnoreCase("Y")));
System.out.println("Proceeding...");
// do the work here
Parvez answered 2019-10-01T14:48:27Z
0 votes
看看这个:
int a,b,c = 0;
if(a == b){
c =1;
}
System.out.print(c);//1
因此,您可以这样编写:
if (a == b)c=1;
但是,如果这段代码是这样的:
int a,b,c=0;
if (a != b){
}
if (a == b ){
c =1;
}
您可以这样写:
if(a != b);
if(a == b )c=1;
因此,您将知道if(a != b);什么也不做
DMW answered 2019-10-01T14:49:51Z
0 votes
if中的分号表示将if条件的终止(如java ;中那样)视为一条语句的结尾,因此if后面的语句将被执行。
Bishal Jaiswal answered 2019-10-01T14:50:30Z
-2 votes
在为班级编程工作时,我正在使用N by N的doodad网格,并将随机doodad的特征与上,下,左,右的特征进行比较,我发现可以很好地使用此功能来防止嵌套语句和 潜在的边界例外。 我的目标是尽量减少代码并避免嵌套if语句。
if (row == 0);
else (method (grid[row][col], grid[row-1][col]));
if (row == N-1);
else (method (grid[row][col], grid[row+1][col]));
if (col == 0);
else (method (grid[row][col], grid[row][col-1]));
if (col == N-1);
else (method (grid[row][col], grid[row][col+1]));
其中method(Doodad a, Doodad b)在a和b之间执行某些操作。
另外,您可以使用异常处理来避免使用这种语法,但是对于我的应用程序,它可以正常工作。
George C answered 2019-10-01T14:51:24Z