13

在 java 中,如果我们必须在之后只执行一个语句,if或者for括号是不必要的。我们可以写:

if(condition)
  executeSingleStatement();

或者

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

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

catch(Exception e)
   e.printStackTrace();

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

4

7 回答 7

7

查找编译器构造教科书并查找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。需要大括号而不是/将是一个适当的 奇怪决定。但无论如何,为了完整起见,请考虑以下代码。trycatchfinally

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

catchofBazExceptionfinally与 inner 还是 external 相关联try?同样,语言设计委员会本可以添加大量语法来消除歧义,但明确的风格再次获胜。如果将语言简化为在任何地方都强制使用显式大括号,那么我在 Sun/Oracle 的工作会轻松一些。

于 2011-06-22T11:57:24.290 回答
5

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

这是一个相关的问题,涉及是否使用括号:JavaScript 的单行语句中是否需要大括号?

于 2011-06-22T05:23:43.287 回答
5

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

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

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

还要注意Java 语言语法

于 2011-06-22T11:42:11.723 回答
2

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

于 2011-06-22T05:39:20.977 回答
1

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

我通过在一行中编写一行代码来帮助自己:

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

对我来说,这是最易读的方式。只有当人们试图将完整的小说写成例外名称时,它才会变得混乱。

catch (CanNotPayAttentionToThatManBehindTheCurtainThrowableRuntimeExceptionWithMessageAndCouseContainItselfAnotherCourseAndMessage e) ...
于 2013-03-12T16:39:22.780 回答
0

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

也就是说,除了“这就是他们设计的方式”之外,我认为您的问题没有真正的答案。

于 2011-06-22T05:29:13.390 回答
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的,由于 的存在,语法会简单得多{}

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

于 2011-06-22T05:59:30.040 回答