查找编译器构造教科书并查找dangling-else ambiguity。
鉴于在 Java 和大多数其他语法糟糕的语言中,空格是存在的。你如何解读:
try
try
stuff();
catch (FooException exc)
handle(exc);
catch (BarException exc)
handle(exc);
catch (BazException exc)
handle(exc);
是吗:
try {
try {
stuff();
} catch (FooException exc) {
handle(exc);
} catch (BarException exc) {
handle(exc);
}
} catch (BazException exc) {
handle(exc);
}
或者:
try {
try {
stuff();
} catch (FooException exc) {
handle(exc);
}
} catch (BarException exc) {
handle(exc);
} catch (BazException exc) {
handle(exc);
}
dangling-else 歧义通过将else
与最内层关联来解决if
。我们要添加更复杂的复杂功能来处理这种糟糕的风格吗?不。
编辑:有一个示例未涵盖的注释catch
。需要大括号而不是/将是一个适当的 奇怪决定。但无论如何,为了完整起见,请考虑以下代码。try
catch
finally
try {
stuff();
} catch (FooException foo)
try {
handle(foo);
} catch (BarException bar)
handle(bar);
catch (BazException baz)
handle(baz);
finally
release();
的catch
ofBazException
和finally
与 inner 还是 external 相关联try
?同样,语言设计委员会本可以添加大量语法来消除歧义,但明确的风格再次获胜。如果将语言简化为在任何地方都强制使用显式大括号,那么我在 Sun/Oracle 的工作会轻松一些。