“if”语句末尾的分号

2022-08-31 13:05:12

今天,经过半个小时的搜索,我发现可以在if语句而不是代码后面放一个分号,如下所示:

if(a == b);
// Do stuff

这基本上意味着无论是否相等,这些东西都会完成,并且该语句没有任何意义。为什么Java没有给我一个错误?是否有任何情况这样做是有用的?abif


答案 1

为什么会发生这种情况?

Java语言规范说:

空语句

空语句不执行任何操作。

EmptyStatement:
    ;

空语句的执行始终正常完成

它本质上意味着,如果 a==b,您希望执行空语句

if(a == b);

你该怎么办:

此问题有两种主要解决方案:

  1. 您可以通过使用代码格式化程序和和 中的周围内容来避免空语句的问题。通过这样做,您的空语句将更具可读性。if{}

    if(a == b){
      ;
    }
    
  2. 您还可以检查用于静态代码分析的工具,例如:

    他们可以立即突出显示诸如此类的问题。

我建议将这两种解决方案结合起来。


答案 2

是否有任何情况这样做是有用的?

有用?如“使您的代码更清晰,更清晰,更快,更易于维护”?一点也不。这很可能是糟糕的、令人困惑的代码

但它不一定是良性的。这样的语句可以执行操作和/或由于引起副作用的方法而改变状态,并且可以选择由于运算符短路而评估这些方法。

if( a() && b() );

在这里,或者可以做某事,并且只有在为真时才会执行。a()b()b()a()

至于为什么,我认为答案很简单,偏离定义的,预期的行为(例如,像这样的语句)比开发人员编写糟糕代码的替代方案更糟糕。while(reader.read());

编写糟糕的代码总是可能的。重申一下,这几乎在任何情况下都是糟糕的代码。


推荐