陷阱 - 错误的分号和缺失的括号
这是一个错误,导致 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
。
在这些示例中,有一个直接的解决方案:只需删除伪分号。但是,从这些例子中可以得出一些更深刻的教训:
-
Java 中的分号不是语法噪音。分号的存在与否可以改变程序的含义。不要只是在每一行的末尾添加它们。
-
不要相信你的代码缩进。在 Java 语言中,编译器会忽略行开头的额外空格。
-
使用自动压头。所有 IDE 和许多简单的文本编辑器都了解如何正确缩进 Java 代码。
-
这是最重要的一课。遵循最新的 Java 风格指南,并在
then
和else
语句以及循环的 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");
}
这对于初学者来说应该是错误的。