为什么java if语句以分号结尾时会失败

vd2z7a6w  于 2021-07-06  发布在  Java
关注(0)|答案(9)|浏览(344)

这个问题在这里已经有答案了

“if”语句结尾的分号(18个答案)
四年前关门了。
我在处理应用程序时犯了一个编码错误,这是对空引用的测试。我花了几个小时才发现问题所在,但我不明白的是为什么代码会这样。

String name = null;
String value = null;

if(name != null && value != null);
{
    System.out.println("Values not null");
}

if语句以结束 ; ,那是我的错误 Values not null 即使很明显两个值都为空,也会打印。有人能解释为什么吗?

bis0qfac

bis0qfac1#

一个光秃秃的 ; 完全是一句空话。在if之后,必须正好有一条语句在 if 这是真的。在您的案例中执行的一个语句是空语句。您可以将多个语句合并为一个语句 {statement; statement;...}

xwbd5t1u

xwbd5t1u2#

这是标准的语法规则。分号终止语句,但语句可能为空,因此这些行:

if (...);
{
}

相当于:

if (...) /* do nothing */ ;

{
    ...
}

以下 { ... } 语句看起来就像任何其他代码块,并且总是被执行,因为 if 声明到那时就完成了。

m4pnthwp

m4pnthwp3#

这个分号结束了一个语句(一个空的语句),因此编译器会将您的代码翻译成如下形式:

if(name != null && value != null)
{
  //nothing here
}
{
  System.out.println("Values not null");
}

换句话说,如果 if 表达式是 true ,它执行空代码块。那么不管 if 如果为true或false,则运行时继续并运行包含 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) 在某些语言中)。

cngwdvgl

cngwdvgl4#

您的代码相当于:

if(name != null && value != null) {
   // empty code block
}

System.out.println("Values not null");
j2qf4p5b

j2qf4p5b5#

要明白,条件语句不必总是跟在大括号后面。如果只想在满足条件的条件下执行一条语句,大多数语言都允许您简单地发出大括号。
意味着以下是完全有效的,例如:

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");
lztngnrs

lztngnrs6#

; 终止语句。

if(name != null && value != null);

相当于:

if(name != null && value != null)
{
}

下面的代码只是一个代码块。

lh80um4z

lh80um4z7#

if(name != null && value != null);
{
    System.out.println("Values not null");
}

相当于:

if(name != null && value != null){}

{
    System.out.println("Values not null");
}
lqfhib0f

lqfhib0f8#

if(name != null && value != null);

如果你的陈述因为分号而结束了。。。
所以,它就像一个 empty 如果阻止:-

if(name != null && value != null) {}

所以你的下一个代码就变成了初始化程序块:-

{
    System.out.println("Values not null");
}

因为它是一个初始化程序块。。无论你做什么,它都会被执行 if 条件评估为。。

kognpnkq

kognpnkq9#

分号结束语句,从而将if从下面的块中分离出来。
请注意,块可以是任意的。

{
System.out.println("This is some code");
}
``` `if(true);` 这是有效的,它没有任何作用。允许这样做的语言是相当愚蠢的,尽管ide应该用警告之类的方式来捕捉这些问题。

相关问题