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

Java捕获块,捕获的异常不是最终异常,java,exception,try-catch,Java,Exception,Try Catch,我正在查看Java SE7的新功能,目前我正在: 关于catch multiple功能,当我遇到以下语句时: 注意:如果catch块处理多个异常类型,则 catch参数是隐式的final。在本例中,catch 参数ex是最终的,因此不能为其指定任何值 在挡块内 我从未注意到捕获的异常在handleing捕获的异常的经典案例中不是最终的 我只是想知道为什么一开始这是件好事?在我猜测重新引用或记录它的消息之前,对捕获的异常进行必要的修改不是不明智的吗?是否应该由trowing机制来创建异常,以便它

我正在查看Java SE7的新功能,目前我正在:

关于catch multiple功能,当我遇到以下语句时:

注意:如果catch块处理多个异常类型,则 catch参数是隐式的final。在本例中,catch 参数ex是最终的,因此不能为其指定任何值 在挡块内

我从未注意到捕获的异常在handleing捕获的异常的经典案例中不是最终的

我只是想知道为什么一开始这是件好事?在我猜测重新引用或记录它的消息之前,对捕获的异常进行必要的修改不是不明智的吗?是否应该由trowing机制来创建异常,以便它准确地表示它应该做的事情


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

它与方法参数几乎相同:

您通常不会修改它们,许多人都认为它们应该被视为
final
(是否真正在它们面前编写
final
,这是一个有争议的问题)

但由于没有技术要求必须是
最终版
,因此该语言为您提供了选择的选项


就我个人而言,我不知道有什么好的理由修改catch块的异常引用。

我能想到的强制执行它的理由是由于性能。一旦渔获量评估开始,在评估机制中有一个最终不变的值可以确保更快地评估所有渔获量。由于try-catch在所有java代码中都被广泛使用,因此最好采用最高性能的设计


基于以上所述,它意味着影响大多数程序的性能改进。

我想不出一个令人信服的用例来修改经典的
catch
子句中的异常。然而,这并不意味着它应该被禁止。特别是考虑到您可以修改参数变量。如果您对此感到不安,可以选择将异常变量声明为
final

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

  catch (IOException | NullPointerException ex) {
      ...
      ex = new IllegalArgumentException(...);
  }
我想这就是设计师在本例中添加限制时的想法


但不管怎样,这就是Java语言的定义,也是我们必须面对的问题。辩论明显的不一致性没有多大意义。。。除非您打算设计和实现一种新的语言。

基于异常的错误处理背后的思想是,如果可能的话,每个错误都应该在适当的抽象级别上恢复。这种错误恢复可能需要在实际处理异常时不直接可用的信息。因此,捕获异常、使用相关信息扩充异常并重新显示它或可能将其设置为更合适类的新异常对象的原因可能比较方便。

嗯,很好,我甚至不知道它在“单一异常”中不是最终的如果它是最终的,因为只有catch块知道这个对象,那么会有什么不同?如果你重新旋转这个物体或另一个物体有关系吗?在大多数情况下,如果将异常包装在另一个异常中并重新启动,则会出现异常。如果它是最终版本,您仍然可以重新调用修改过的副本。我能想到的唯一原因是,如果出于某种原因,您想在异常上使用setStackTrace()方法编辑或添加堆栈跟踪。being
final
不会保留异常的方法不被调用,无论它们是否修改异常
final
不是const的同义词在COh中,我误读了这个问题,我认为它意味着类是final而不是对象。在这种情况下,它可能不会给你一个答案,但这里发生了一个类似的问题:非常有趣的一点!我想这是有道理的,不过我还是觉得这个案子有点特别。我个人会考虑修改和例外的任何方式,因为它是一个坏的做法。非常感谢您的关注@user1960804:请记住,“修改异常”(通过一些方法调用)和
final
引用是正交的(其中一个不会影响另一个)!是的,我知道,我必须说,考虑到这一点,我仍然有同样的感觉。这更像是关于最后一个关键字的性质。我没有想到这一点,我想知道其他人对此有什么看法?我不认为这会有任何区别,从性能角度看。JIT编译器完全能够计算出局部变量在初始赋值后是否发生更改。。。并在此基础上进行优化。它不需要隐式或显式的
final
提示。然而,毫无疑问,理解这种语言总是让每个人更接近于开发最佳代码。实际上,我问这个问题是为了找出是否有人有任何可行的理由修改引用本身。我不会很快实现新语言。:/谢谢你的关注!catch(IOException | NullPointerException ex)是Java 7中的新语法吗?是的!你可以通过我在问题中添加的链接阅读所有关于它的信息。所有这些都不需要为变量指定一个新的值,但通过将异常本身设置为final也不会阻止这些。很抱歉,有人刚刚编辑了一篇6年前的帖子,删除了一个“谢谢”。