为什么Java if语句以分号结尾时会失败[duplicate]

y1aodyip  于 2023-01-24  发布在  Java
关注(0)|答案(9)|浏览(138)
    • 此问题在此处已有答案**:

(18个答案)
六年前关闭了。
我在一个应用程序上犯了一个编码错误,那是一个空引用测试。我花了几个小时才发现问题是什么,但我不明白的是为什么代码会这样。

String name = null;
String value = null;

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

if语句以;结尾,这是我的错误,即使很明显两个值都是null,Values not null还是被打印出来了,有人能解释一下为什么吗?

wwodge7n

wwodge7n1#

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

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))。

zqdjd7g9

zqdjd7g92#

;终止语句。

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

相当于:

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

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

j13ufse2

j13ufse23#

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

相当于:

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

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

vsaztqbk4#

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

这里你的if语句因为分号而结束了...
因此,它就像一个empty if块:-

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

因此,下一个代码将成为初始化程序块:-

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

因为它是一个初始化程序块..无论if条件的计算结果是什么,它都会被执行。

o2gm4chl

o2gm4chl5#

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

if (...);
{
}

相当于:

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

{
    ...
}

下面的{ ... }语句看起来就像任何其他代码块一样,并且将始终被执行,因为if语句到那时已经完成。

xnifntxz

xnifntxz6#

您的代码等效于:

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

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

ylamdve67#

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

{
System.out.println("This is some code");
}

if(true);这是有效的,它什么也不做。允许这样做的语言相当愚蠢,尽管IDE应该用警告之类的东西来捕捉这些问题。

06odsfpq

06odsfpq8#

一个空的;是一个完整的空语句。在if之后,当if为true时,必须正好有一个将执行的语句。在您的case中执行的一个语句是空语句。您可以使用{statement; statement;...}将多个语句组合为一个语句

bis0qfac

bis0qfac9#

要知道,条件语句不一定要跟在左括号和右括号后面,如果你只想在满足条件时执行一条语句,大多数语言都允许你直接发出括号。
意味着以下内容是完全有效的,例如:

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

相关问题