EntityNotFoundException应该扩展Exception还是RuntimeException?

时间:2013-10-23 08:38:47

标签: java exception runtimeexception

我的应用程序服务中有一个接收实体的 id 的方法:

 Document doStuff(Long documentId);

在我的方法中,我正在检查传递的id是否与先前存储的实体匹配,否则会抛出异常。

现在,我怀疑,这是com.application.exceptions.DocumentNotFoundException一个RuntimeException还是Exception

使用它来管理案件的Service部队的ID是错误的,还是隐含的?

5 个答案:

答案 0 :(得分:2)

作为参考:

enter image description here

运行时异常(未经检查的异常)

  

RuntimeException 类表示Java虚拟机中发生的异常(在运行时)。一个   运行时异常的示例是 NullPointerException 。检查运行时异常的成本通常超过了捕获它的好处。试图一直捕获或指定所有这些将使您的代码不可读且不可维护。编译器允许运行时异常未被捕获和未指定。如果你   比如,您可以像其他例外一样捕获这些异常。但是,您不必在“投掷”中声明它。条款或在捕获条款中捕获它。

此外,您可以创建自己的RuntimeException子类,这种方法可能是首选,因为已检查的异常可能会使方法复杂化 签名,可能很难遵循。

为什么不建议捕获“异常”类型

  

Java中的异常处理本质上是多态。例如,如果您在代码中捕获类型Exception,那么它   可以捕获或抛出其后代类型,如IOException。因此,如果您在之前捕获类型Exception   键入IOException然后类型Exception块将捕获整个异常并键入IOException块   永远达不到。为了捕获类型IOException并以不同方式处理它以键入Exception,IOException   应该先被抓住(记住你不能在一个较小的篮子上方有一个更大的篮子)。

答案 1 :(得分:1)

我认为你要问的是它是否是一个已检查或未经检查的异常;我们看到它是未经检查的。

如果您要声明您的异常类 - 它应遵循相同的路径,即创建未经检查的异常。

答案 2 :(得分:0)

http://docs.oracle.com/javaee/6/api/javax/persistence/EntityNotFoundException.html

EntityNotFoundException是一个RuntimeException,它是一个Exception。虽然请记住,未编译的RuntimeExceptions将编译。

您应该使用EntityNotFoundException

答案 3 :(得分:0)

由于EntityNotFoundException派生自

javax.persistence.PersistenceException 

PersistenceException 派生自     的了java.lang.RuntimeException

如此直接的you你应该延伸

java.lang.RuntimeException.

答案 4 :(得分:0)

  

现在,我怀疑,这是com.application.exceptions.DocumentNotFoundException一个RuntimeException还是Exception

如果我们看到你的异常类及其超类的源代码,我们只能回答这个问题。

  • 如果RuntimeException是超类,则您的例外是RuntimeException;即未经检查的例外。

  • 否则,如果Exception是超类,则您的例外是Exception;即它是已检查例外。

  • 否则,您通过声明Error或a(天堂禁止!)Throwable的子类来“违反规则”。 (在前一种情况下,例外是未选中。在后一种情况下......你要求麻烦!)


  

服务人员是否应该使用它来管理案例的id是错误的,还是隐含的?

这是由您根据该方法的语义...以及您的API来决定的。检查异常是否是一个好主意是一个观点问题。但这是我用来决定的标准:

  • 如果使用无效ID调用该方法是“错误”(即编程错误),则建议将其作为未经检查的异常。

  • 这是一个问题,你期望应用程序尝试处理异常,然后建议将其作为检查异常。这样程序员就不会忘记。

您需要根据具体情况做出这些判断。