Java catch 块,捕获的异常不是最终的

2022-09-03 15:50:14

我正在查看Java SE7的新功能,目前我处于这一点:

http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html

关于捕获多个功能,当我遇到这个声明时:

注: 如果 catch 块处理多个异常类型,则 catch 参数是隐式 final。在此示例中,catch 参数 ex 是 final,因此您无法在 catch 块中为其赋值任何值。

我从未注意到,在处理捕获的异常的经典情况下,捕获的异常不是最终的。

我只是想知道为什么这首先是一件好事?在我猜想重新抛出一个异常或记录它的消息之前,基本上修改一个捕获的异常,这不是不明智的吗?难道不应该由trowing机制来创建例外,以便它准确地代表它应该代表的东西吗?

我从未见过在捕获块中修改异常,也许有人可以指出它的好处吗?


答案 1

它与方法参数几乎相同:

通常不会修改它们,许多人都同意它们应该被当作(是否真的在他们面前写作是一个有争议的问题)。finalfinal

但是,由于没有技术要求说它必须是,该语言为您提供了选择的选项。final

就我个人而言,我知道没有充分的理由修改捕获块的异常引用。


答案 2

我想不出一个令人信服的用例来修改经典子句中的异常。但是,这并不意味着它应该被禁止。特别是考虑到您可以修改参数变量。如果您发现这令人担忧,则可以选择将异常变量声明为 。catchfinal

另一方面,允许在多异常捕获中进行修改会引入真正奇怪和令人困惑的代码的可能性,例如:

  catch (IOException | NullPointerException ex) {
      ...
      ex = new IllegalArgumentException(...);
  }

我想这就是设计师在这种情况下添加限制时所想到的。

但无论哪种方式,这就是Java语言的定义,也是我们必须忍受的。辩论明显的不一致没有多大意义......除非你打算设计和实现一门新语言。