我正在查看Java SE7的新功能,目前我正在这里:
http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html
关于catch catch功能,当我遇到这个声明时:
注意:如果catch块处理多个异常类型,那么 catch参数是隐式最终的。在这个例子中,捕获 参数ex是final,因此您无法为其指定任何值 在拦截区内。
我从未注意到在处理捕获的异常的经典案例中,捕获的异常不是最终的。
我只是想知道为什么这首先是好事?在我猜想重新抛出它或者记录它的消息之前,对于一个被捕获的异常进行必要的修改是不是不明智?是否应该由trowing机制来创建异常,以便它代表它应该是什么呢?
我从未见过在catch块中修改过的异常可能有人指出它有什么好处?
谢谢!
答案 0 :(得分:4)
它与方法参数几乎相同:
你通常不修改它们许多人同意将它们视为final
(是否实际写{{1}在他们面前是一个有争议的问题。)
但由于没有技术要求说它必须是final
,因此该语言可让您选择。
我个人认为没有理由修改catch-block的异常引用。
答案 1 :(得分:3)
我无法想象一个令人信服的用例来修改经典catch
子句中的异常。但是,这并不意味着它应该被禁止。特别是假设您可以修改参数变量。如果您发现这令人担忧,您可以选择将异常变量声明为final
。
另一方面,允许修改多异常捕获会引入真正奇怪和令人困惑的代码的可能性,例如:
catch (IOException | NullPointerException ex) {
...
ex = new IllegalArgumentException(...);
}
我想这就是设计师在这种情况下加入限制时的想法。
但不管怎样,这就是Java语言的定义方式,以及我们必须接受的内容。除非你打算设计和实现一种新语言,否则在讨论明显的不一致性方面没有太多意义。
答案 2 :(得分:0)
我能想到最终强制执行的原因是由于表现。一旦捕获评估开始,在评估机制中具有最终的不可变值可确保更快地评估所有捕获量。由于try-catch广泛用于任何Java代码,因此最高性能设计更为可取。
基于以上所述,它意味着性能的提升会影响大多数程序。
答案 3 :(得分:0)
基于异常的错误处理背后的想法是,如果可能的话,应该在适当的抽象级别恢复每个错误。此类错误恢复可能需要在实际处理异常时无法直接获得的信息。由于这个原因,捕获异常可能很方便,用相关信息扩充它并重新抛出它,或者可能将它设置为更合适的类的新异常对象的原因。