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


当前回答

运行时异常类(RuntimeException及其子类)不需要进行编译时检查,因为编译器不能确定运行时异常不会发生。(从JLS)。

在你设计的类中,你应该子类化Exception并抛出实例 它表示任何异常情况。这样做将显式地发出信号 你的类的客户端使用你的类可能会抛出异常,他们必须这样做 采取措施处理这些异常情况。

下面的代码片段解释了这一点:

//Create your own exception class subclassing from Exception
class MyException extends Exception {
    public MyException(final String message) {
        super(message);
    }
}

public class Process {
    public void execute() {
        throw new RuntimeException("Runtime");
    }  
    public void process() throws MyException {
        throw new MyException("Checked");
    }
}

在上面的类定义类Process中,方法execute can 抛出一个RuntimeException,但方法声明不需要指定 它抛出RuntimeException。

方法进程抛出一个检查过的异常,它应该声明它 将抛出MyException类型的检查异常,不这样做将是 编译错误。

上面的类定义也会影响使用Process类的代码。

调用new Process().execute()是一个有效的调用,其中form .execute()调用 new Process(). Process()给出一个编译错误。这是因为客户端代码应该如此 采取步骤来处理MyException(例如call to process()可以包含在 try/catch块)。

其他回答

RuntimeException是Exception类的子类

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

等级制度是

java . lang . object

——java.lang.Throwable

——java.lang.Exception

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

通常runtimeexception是可以通过编程方式阻止的异常。例如NullPointerException, ArrayIndexOutOfBoundException。如果在调用任何方法之前检查null, NullPointerException将永远不会发生。类似地,如果先检查索引,ArrayIndexOutOfBoundException也不会发生。RuntimeException不被编译器检查,所以它是干净的代码。

编辑:现在人们喜欢RuntimeException,因为它生成的代码很干净。这完全是个人的选择。

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

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

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

Exception被选中,RuntimeException未选中。

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

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