【问题标题】:Why brackets are necessary in catch block in java?为什么Java中的catch块中需要括号?
【发布时间】:2011-06-22 05:17:10
【问题描述】:

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

if(condition)
  executeSingleStatement();

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

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

catch(Exception e)
   e.printStackTrace();

因为在大多数情况下 我们 我在 catch 块中只有一个语句,即 e.printStackTrace() while testing 或 logging 语句。

【问题讨论】:

  • 一个方法需要花括号,即使是单语句方法也是如此。也许是因为有一个隐含的 e = throwException;作为 catch 块中的第一条语句。
  • @MeBigFatGuy:e = thrownException; 是什么意思?我们在参数块中将e 声明为异常,那么为什么需要此语句?
  • @Harry Joy:想想看。 'e' 如何包含异常对象?
  • @Gkelly , @MeBigFatGuy :所以它会首先初始化 e 并处理已经发生的异常,然后进行其余的处理。我说的对吗?
  • 附带说明:另一个有趣的情况是,您根本没有像 if(condition); 这样的任何正文(请注意末尾的分号)

标签: java syntax braces catch-block


【解决方案1】:

查找编译器构造教科书并查找 dangling-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);
}

通过将else 与最里面的if 相关联来解决悬空-else 歧义。我们要添加更复杂的复杂功能来处理这种糟糕的风格吗?没有。

编辑:有一条注释说明该示例未涵盖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 关联还是与外部try 关联?同样,语言设计委员会本可以添加大量语法来消除歧义,但明确的风格再次获胜。如果将语言简化为在任何地方都强制使用显式大括号,我在 Sun/Oracle 的工作会轻松一些。

【讨论】:

  • 您的回答完美地解释了为什么我们需要括号进行尝试,但我仍然不清楚是否需要带有 catch 语句的括号
  • 你的解释使用糟糕的风格作为一个原因,如果这是语言设计师的实际原因,他们就不会停在那里
【解决方案2】:

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

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

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

另请注意Java language grammar

【讨论】:

    【解决方案3】:

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

    这是一个相关的问题,涉及是否使用括号:Are curly braces necessary in one-line statements in JavaScript?

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我认为您的答案可以详细说明,但您有所了解。这同样适用于许多其他命令。例如,类 { } 是否需要括号(例如“class int no;”是否也有效?)
      • 我知道 catch 需要括号(根据 Java 规范),但我想知道为什么需要它?
      • 这怎么会+2?你无法用规则本身来解释规则。
      【解决方案5】:

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

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

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

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

      catch (CanNotPayAttentionToThatManBehindTheCurtainThrowableRuntimeExceptionWithMessageAndCouseContainItselfAnotherCourseAndMessage e) ...
      

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

          • 这不是程序员的争论,因为当程序员写下他的代码时,语言已经设计好了,语法已经写好了,编译器生成器已经完成了他的工作。
          猜你喜欢
          • 1970-01-01
          • 2016-10-01
          • 2014-08-09
          • 1970-01-01
          • 1970-01-01
          • 2019-10-27
          • 1970-01-01
          • 1970-01-01
          • 2017-11-07
          相关资源
          最近更新 更多