为什么在java中的捕获块中需要括号?

2022-09-04 19:42:12

在java中,如果我们只需要在后面执行一个语句,或者括号不是必需的。我们可以这样写:iffor

if(condition)
  executeSingleStatement();

for(init;condition;incr)
  executeSingleStatement();

但是在捕获块的情况下,为什么我们不能省略括号?为什么这是不可能的?

catch(Exception e)
   e.printStackTrace();

因为在大多数情况下,我在 catch 块中只有一个语句,该语句要么在测试中,要么在记录语句中。e.printStackTrace()


答案 1

找到一本编译器结构教科书,并查找悬而未决的模糊性

鉴于在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);
}

悬空的 - 其他歧义通过将 与 最里面的 .我们是否要添加更复杂的复杂性来处理这种糟糕的风格?哈哈elseif

编辑:有一条评论,该示例未涵盖 。这是一个适当的奇怪决定,要求大括号,但不要求/。但无论如何,为了完整起见,请考虑以下代码。catchtrycatchfinally

try {
stuff();
} catch (FooException foo)
try {
handle(foo);
} catch (BarException bar)
handle(bar);
catch (BazException baz)
handle(baz);
finally
release();

是的 和 与内在的还是外在的 ?同样,语言设计委员会本可以添加大量语法来消除歧义,但明确的风格再次获胜。我在 Sun/Oracle 的工作会稍微容易一些,如果语言被简化为要求在任何地方都使用显式大括号。catchBazExceptionfinallytry


答案 2

这不是一个可能或不可能的问题。这只是一个语言(语法)设计决策。

Java语言解析器有几种实现。可以在不到一天的时间内修改解析器源,并允许无括号括起来的 catch 语句。

http://www.google.com/search?q=java+parser

还要注意 Java 语言语法