我应该在throws规范中声明未经检查的异常吗?

maf*_*afu 28 java exception throws

我知道必须处理或指定已检查的异常,但未经检查的异常是可选的.

如果由于某种原因我可以合理地预期在方法中发生未经检查的异常,我应该将它添加到throws规范吗?或者我应该尽可能缩短规格?

das*_*ght 23

如果由于某种原因我可以合理地预期在方法中发生未经检查的异常,我应该将它添加到throws规范吗?

由于未经检查的异常表示编程错误,因此throws应避免在子句中声明它们.通常,除了程序的最高级别之外,不应尝试捕获这些异常.这个规则有一些例外(双关语) - 例如,在生产代码中你应该捕捉NumberFormatException.

注意:有时,框架的作者会使其基本异常继承RuntimeException(例如HibernateException).这样的例外情况也应该被捕获.

  • 除了“NumberFormatException”。当用户输入号码时,应该始终捕捉到这一点。 (2认同)
  • 好点子.另一方面,如果异常恰好未经检查,即使用户可以处理它,那么我可以添加它,根据这个推理.是对的吗? (2认同)
  • Josh Bloch在_Effective Java_中同意这个答案:"不要使用throws关键字在方法声明中包含未经检查的异常"(2e,p.252).他的理由是鼓励在throws子句中声明`HibernateException`. (2认同)

Sib*_*bbo 7

这是一个设计决定.通常你不会这样做.但是如果你认为代码的用户抓住它是至关重要的Exception,那么这是暗示他这样做的一种方式.另一种方法是将它添加到文档中,并解释为什么捕获它是很重要的Exception.


Men*_*ild 7

在 throws-clause 中显式声明是没有必要的,因为它是关于运行时异常的,但您应该在 javadoc 中记录它,以便用户可以了解在什么情况下可能会发生此异常以及它的含义。