为什么java中的catch块需要括号?

时间:2011-06-22 05:17:11

标签: java syntax braces catch-block

在java中,如果我们必须在iffor之后只执行一个语句,则不需要括号。我们可以写:

if(condition)
  executeSingleStatement();

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

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

catch(Exception e)
   e.printStackTrace();

因为在大多数情况下我们我在catch块中只有一个语句,它在测试或记录语句时是e.printStackTrace()

7 个答案:

答案 0 :(得分:6)

查找编译器构建教科书并查找悬空 - 否则模糊。

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

通过将else与最内层if相关联,解决了悬空 - 其他歧义。我们是否想要添加更复杂的复杂功能来处理这种糟糕的风格?否。

答案 1 :(得分:5)

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

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

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

另请注意Java language grammar

答案 2 :(得分:4)

我不确定为什么Java不允许这样做,但总的来说,即使只有一个语句,使用括号也是更好的方式。它使阅读和扩展更容易。

以下是解决是否使用括号的相关问题:Are curly braces necessary in one-line statements in JavaScript?

答案 3 :(得分:2)

来自Java Language Spec 3.0 - 如果你看第14章,它会讨论块和语句。块由{和}标识,并包含许多语句。 Try / catch / finally是块,根据语言规范需要在{}中进行分组。

答案 4 :(得分:1)

我也没有看到编写无用代码有任何好处,我也不明白更多文本可以更容易。

我通过在一行中编写单行捕获来帮助自己:

catch (InvalidArgumentException e) { die (e.getMessage()); }
catch (Exception e)                { die (e); }

对我而言,这是最易读的方式。当人们试图将完整的小说写成异常名称时,它只会变得混乱。

catch (CanNotPayAttentionToThatManBehindTheCurtainThrowableRuntimeExceptionWithMessageAndCouseContainItselfAnotherCourseAndMessage e) ...

答案 5 :(得分:0)

我认为“在大多数情况下”你应该做的不仅仅是打印或记录堆栈跟踪。这意味着你吞咽了一个例外,这通常不是一个好习惯。至少,如果你不能从异常中优雅地恢复,你应该记录并重新抛出它,以防堆栈中更高的代码可以。

那就是说,我认为除了“这就是他们如何设计它”之外,你的问题确实没有答案。

答案 6 :(得分:0)

可能继承自C ++。不知道为什么C ++会这样做。在这里查看我的想法:https://stackoverflow.com/questions/6254595/how-do-you-use-the-return/6255489#6255489

值得注意的是{}使语法更简单,即使语言设计者的生活更轻松。 if语句就是一个很好的例子 - 你喜欢的便利并不便宜。

由于模糊不清,如

if(c1) if(c2) A; else B;

interpretation 1 
if(c1)
    if(c2) 
        A;
    else 
        B;

interpretation 2 
if(c1)
    if(c2) 
        A;
else 
    B;

必须调整if的语法以解决歧义。假设需要block而不是任意statement,由于存在{},语法会更简单。

所以他们可能只是感到懒惰。