有人能解释一下java.lang.RuntimeException和java.lang.Exception的区别吗?如果我创建自己的异常,我如何决定扩展哪一个?


当前回答

异常是处理应用程序流中意外事件的好方法。RuntimeException不被编译器检查,但你可能更喜欢使用扩展异常类的异常来控制你的api客户端的行为,因为他们需要为他们编译捕获错误。也可以形成良好的文档。

如果想要实现干净的接口,请使用继承来子类化应用程序具有的不同类型的异常,然后公开父异常。

其他回答

有两种类型的异常,如果你得到这种类型的异常,你可以从检查异常恢复。运行时异常是不可恢复的,运行时异常是编程错误,程序员应该在编写代码时注意它,继续执行这个可能会给你不正确的结果。运行时异常是关于违反先决条件的,例如,你有一个大小为10的数组,并且你试图访问第11个元素,它将抛出ArrayIndexOutOfBoundException

Exception被选中,RuntimeException未选中。

Checked表示编译器要求您在catch中处理异常,或将您的方法声明为抛出异常(或其超类之一)。

通常,如果API的调用者希望处理异常,则抛出已检查异常,如果调用者通常无法处理异常,则抛出未检查异常,例如其中一个参数的错误,即编程错误。

正确使用RuntimeException?

不受限制的例外——争议:

如果客户可以合理的预期 要从异常中恢复,请使用 一个已检查的异常。如果客户 做什么都无法挽回 异常,使其为未检查的 例外。

注意,未检查异常是从RuntimeException派生的异常,而已检查异常是从exception派生的异常。

如果客户端无法从异常中恢复,为什么要抛出RuntimeException ?文章解释道:

运行时异常表示问题 这是编程的结果 问题,以及API客户端 不能合理地期望代码这样做 从它们中恢复或者处理它们 任何方式。这些问题包括 算术异常,例如 除以零;指针异常, 比如试图访问一个对象 通过空引用;和索引 例外情况,例如试图 控件访问数组元素 索引过大或过小。

异常是处理应用程序流中意外事件的好方法。RuntimeException不被编译器检查,但你可能更喜欢使用扩展异常类的异常来控制你的api客户端的行为,因为他们需要为他们编译捕获错误。也可以形成良好的文档。

如果想要实现干净的接口,请使用继承来子类化应用程序具有的不同类型的异常,然后公开父异常。

RuntimeException是Exception类的子类

这是Exception类的许多子类之一。RuntimeException是在Java虚拟机正常操作期间可以抛出的异常的超类。方法不需要在其throws子句中声明RuntimeException的任何子类,这些子类可能在方法执行期间抛出但未被捕获。

等级制度是

java . lang . object

——java.lang.Throwable

——java.lang.Exception

------------- java.lang.RuntimeException