在java中,如果我们必须在if
或for
之后只执行一条语句,则不需要括号。我们可以写:
if(condition)
executeSingleStatement();
或
for(init;condition;incr)
executeSingleStatement();
但是在catchblock的情况下,为什么我们不能省略括号呢?为什么这不可能?
catch(Exception e)
e.printStackTrace();
因为在
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();
BazException
和finally
的catch
与内部或外部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
,由于{}
的存在,语法会简单得多。
所以他们可能只是觉得懒。