陷阱 - 错误的分号和缺失的括号

这是一个错误,导致 Java 初学者真正的困惑,至少他们第一次这样做。而不是写这个:

if (feeling == HAPPY)
    System.out.println("Smile");
else
    System.out.println("Frown");

他们不小心写了这个:

if (feeling == HAPPY);
    System.out.println("Smile");
else
    System.out.println("Frown");

当 Java 编译器告诉他们 else 错位时,他们感到困惑。Java 编译器解释如下:

if (feeling == HAPPY)
    /*empty statement*/ ;
System.out.println("Smile");   // This is unconditional
else                           // This is misplaced.  A statement cannot
                               // start with 'else'
System.out.println("Frown");

在其他情况下,不会出现编译错误,但代码不会执行程序员的意图。例如:

for (int i = 0; i < 5; i++);
    System.out.println("Hello");

只打印一次你好。再一次,错误的分号意味着 for 循环的主体是一个空的陈述。这意味着随后的 println 调用是无条件的。

另一种变化:

for (int i = 0; i < 5; i++);
    System.out.println("The number is " + i);

这将为 i 提供无法找到符号错误。错误的分号的存在意味着 println 调用试图在其范围之外使用 i

在这些示例中,有一个直接的解决方案:只需删除伪分号。但是,从这些例子中可以得出一些更深刻的教训:

  1. Java 中的分号不是语法噪音。分号的存在与否可以改变程序的含义。不要只是在每一行的末尾添加它们。

  2. 不要相信你的代码缩进。在 Java 语言中,编译器会忽略行开头的额外空格。

  3. 使用自动压头。所有 IDE 和许多简单的文本编辑器都了解如何正确缩进 Java 代码。

  4. 这是最重要的一课。遵循最新的 Java 风格指南,并在 thenelse 语句以及循环的 body 语句周围添加大括号。开口支撑({)不应该在新的线上。

如果程序员遵循样式规则那么带有错误分号的 if 示例将如下所示:

if (feeling == HAPPY); {
    System.out.println("Smile");
} else {
    System.out.println("Frown");
}

对于有经验的人来说这看起来很奇怪如果你自动缩进该代码,它可能看起来像这样:

if (feeling == HAPPY); {
                           System.out.println("Smile");
                       } else {
                           System.out.println("Frown");
                       }

这对于初学者来说应该是错误的。