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



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

if(condition)
  executeSingleStatement();

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

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

catch(Exception e)
   e.printStackTrace();

因为在

的大多数情况下,我们在catch块中只有一条语句,它要么是测试时的e.printStackTrace(),要么是日志记录语句。

找到一本编译器构造教材,查找悬挂的else模糊性

考虑到在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);
}

通过将CCD_ 4与最内部的CCD_。我们想增加一个更复杂的复杂性来处理这种糟糕的风格吗?编号

编辑:有一条评论说,该示例没有涵盖catch。在try上需要大括号而不是catch/finally,这将是一个恰当的奇怪的决定。但无论如何,为了完整性,请考虑以下代码。

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

BazExceptionfinallycatch与内部或外部try关联吗?语言设计委员会本可以添加大量语法来消除歧义,但明确的风格再次获胜。如果语言被简化为在任何地方都强制使用明确的大括号,我在Sun/Oracle的工作就会轻松一点。

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

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

http://www.google.com/search?q=java+分析器

还要注意Java语言语法。

我不知道Java为什么不允许这样做,但一般来说,即使只有一条语句,使用括号也是更好的风格。它使它更易于阅读和扩展。

这里有一个相关的问题,解决了是否使用括号:JavaScript中的单行语句中是否需要大括号?

来自Java语言规范3.0-如果你看一下第14章,它谈到了块和语句。块由{和}标识,并包含许多语句。Try/catch/finaly是块,根据语言规范,这些块需要分组到{}中。

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

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

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

对我来说,这是最可读的方式。只有当人们试图把完整的小说写成例外的名字时,它才会变得杂乱无章。

catch (CanNotPayAttentionToThatManBehindTheCurtainThrowableRuntimeExceptionWithMessageAndCouseContainItselfAnotherCourseAndMessage e) ...

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

也就是说,我认为除了"他们就是这样设计的"之外,你的问题真的没有答案。

可能继承自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,由于{}的存在,语法会简单得多。

所以他们可能只是觉得懒。

相关内容

  • 没有找到相关文章

最新更新