java.lang.RuntimeException与java.lang.Exception的区别

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

295812 次浏览

Exception被选中,而RuntimeException未选中。

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

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

在Java中,有两种类型的异常:已检查异常和未检查异常。已检查异常必须由代码显式地处理,而未检查异常则不需要显式地处理。

对于受控异常,您要么必须在可能抛出异常的代码周围放置一个try/catch块,要么向方法添加一个“throws”子句,以指示方法可能抛出这种类型的异常(必须在调用类或以上类中处理)。

从“exception”派生的任何异常都是受控异常,而从RuntimeException派生的类则是非受控异常。调用代码不需要显式地处理runtimeexception。

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

编辑:这些天人们喜欢RuntimeException,因为它产生干净的代码。这完全是个人的选择。

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

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

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

//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");
}
}
在上面类过程的类定义中,方法execute可以 抛出RuntimeException,但方法声明不需要指定 它抛出RuntimeException.

方法process抛出一个检查异常,它应该声明它 将抛出MyException类型的受控异常,不这样做将是

.编译错误

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

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

在看java.lang.RuntimeExceptionjava.lang.Exception类之间的区别之前,你必须知道Exception的层次结构。ExceptionError类都派生自类Throwable(派生自类Object)。类RuntimeException派生自类Exception

所有异常都派生自ExceptionRuntimeException

所有派生自RuntimeException的异常都被称为< em >无节制的< / em >异常。所有其他异常都是检查< em > < / em >异常。必须在代码中的某个地方捕获受控异常,否则将无法编译。这就是为什么它们被称为受控异常。另一方面,对于未检查的异常,调用方法没有义务处理或声明它。

因此,编译器强制你处理的所有异常都直接派生自java.lang.Exception,而编译器不强制你处理的所有其他异常都派生自java.lang.RuntimeException

以下是RuntimeException的一些直接已知子类。

AnnotationTypeMismatchException,
ArithmeticException,
ArrayStoreException,
BufferOverflowException,
BufferUnderflowException,
CannotRedoException,
CannotUndoException,
ClassCastException,
CMMException,
ConcurrentModificationException,
DataBindingException,
DOMException,
EmptyStackException,
EnumConstantNotPresentException,
EventException,
IllegalArgumentException,
IllegalMonitorStateException,
IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IncompleteAnnotationException,
IndexOutOfBoundsException,
JMRuntimeException,
LSException,
MalformedParameterizedTypeException,
MirroredTypeException,
MirroredTypesException,
MissingResourceException,
NegativeArraySizeException,
NoSuchElementException,
NoSuchMechanismException,
NullPointerException,
ProfileDataException,
ProviderException,
RasterFormatException,
RejectedExecutionException,
SecurityException,
SystemException,
TypeConstraintException,
TypeNotPresentException,
UndeclaredThrowableException,
UnknownAnnotationValueException,
UnknownElementException,
UnknownTypeException,
UnmodifiableSetException,
UnsupportedOperationException,
WebServiceException

来自oracle文档:

以下是底线准则:如果客户可以合理地 希望从异常中恢复,使其成为受控异常。如果 客户端不能做任何事情来从异常中恢复 不例外。< / p >

运行时异常表示由编程问题导致的问题,因此,API客户端代码不能合理地期望从它们中恢复或以任何方式处理它们。

runtimeexception类似于“无效使用api导致的异常”:IllegalStateException, NegativeArraySizeException, NullpointerException

对于异常,你必须显式地捕获它,因为你仍然可以做一些事情来恢复。异常的例子有:IOException, TimeoutException, PrintException…

正确使用RuntimeException?< / >

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

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

注意,未经检查的异常源自RuntimeException,而已检查的异常源自Exception

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

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

.索引过大或太小

RuntimeException是Exception类的子类

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

等级制度是

java . lang . object

——java.lang.Throwable

——java.lang.Exception

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

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

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

简单地说,如果你的客户端/用户可以从异常中恢复,那么将其设置为检查 异常,如果你的客户端无法从异常中恢复,那么将其设置为无节制的 RuntimeException。例如,RuntimeException将是一个编程错误,就像除零一样,除了程序员自己,没有用户可以做任何事情,那么它是RuntimeException

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

  1. 用户定义异常可以是已检查异常或未检查异常,这取决于它扩展到的类。

  2. 用户定义异常可以是自定义检查异常,如果它扩展到异常类

  3. 用户定义异常可以是自定义未检查异常,如果它扩展到运行时异常类。

  4. 定义一个类,并使其成为异常或运行时异常的子类