有人能解释一下java.lang.RuntimeException和java.lang.Exception的区别吗?如果我创建自己的异常,我如何决定扩展哪一个?
当前回答
Exception被选中,RuntimeException未选中。
Checked表示编译器要求您在catch中处理异常,或将您的方法声明为抛出异常(或其超类之一)。
通常,如果API的调用者希望处理异常,则抛出已检查异常,如果调用者通常无法处理异常,则抛出未检查异常,例如其中一个参数的错误,即编程错误。
其他回答
正确使用RuntimeException?
不受限制的例外——争议:
如果客户可以合理的预期 要从异常中恢复,请使用 一个已检查的异常。如果客户 做什么都无法挽回 异常,使其为未检查的 例外。
注意,未检查异常是从RuntimeException派生的异常,而已检查异常是从exception派生的异常。
如果客户端无法从异常中恢复,为什么要抛出RuntimeException ?文章解释道:
运行时异常表示问题 这是编程的结果 问题,以及API客户端 不能合理地期望代码这样做 从它们中恢复或者处理它们 任何方式。这些问题包括 算术异常,例如 除以零;指针异常, 比如试图访问一个对象 通过空引用;和索引 例外情况,例如试图 控件访问数组元素 索引过大或过小。
来自oracle文档:
这是底线原则:如果客户可以合理地 希望从异常中恢复,使其成为受控异常。如果 客户端不能做任何事情来从异常中恢复 未经检查的异常。
运行时异常表示由编程问题导致的问题,因此,API客户端代码不能合理地期望从中恢复或以任何方式处理它们。
runtimeexception类似于“无效使用api导致的异常”:IllegalStateException, NegativeArraySizeException, NullpointerException
对于异常,你必须显式地捕获它,因为你仍然可以做一些事情来恢复。异常的例子有:IOException, TimeoutException, PrintException…
简单地说,如果你的客户端/用户可以从异常中恢复,那么将其设置为Checked Exception,如果你的客户端不能从异常中恢复,那么将其设置为Unchecked RuntimeException。例如,RuntimeException是一个编程错误,就像除零一样,除了程序员自己,没有用户可以做任何事情,那么它就是一个RuntimeException。
在了解java.lang.RuntimeException和java.lang.Exception类之间的区别之前,您必须了解Exception层次结构。Exception类和Error类都派生自类Throwable(派生自类Object)。类RuntimeException派生自类Exception。
所有异常都派生自Exception或RuntimeException。
所有派生自RuntimeException的异常都被称为未检查异常。所有其他异常都是检查异常。必须在代码中的某个地方捕获受控异常,否则将无法编译。这就是为什么它们被称为受控异常。另一方面,对于未检查的异常,调用方法没有义务处理或声明它。
因此,编译器强制你处理的所有异常都直接派生自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
运行时异常类(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块)。
推荐文章
- 指定的子节点已经有一个父节点。你必须先在子对象的父对象上调用removeView() (Android)
- 对于一个布尔字段,它的getter/setter的命名约定是什么?
- 如何获得当前屏幕方向?
- 如何在Android中渲染PDF文件
- 如何计算一个元素在列表中出现的次数
- c++中类似于java的instanceof
- 我如何解决错误“minCompileSdk(31)指定在一个依赖的AAR元数据”在本机Java或Kotlin?
- 如何POST表单数据与Spring RestTemplate?
- Mockito中检测到未完成的存根
- 我如何捕获一个numpy警告,就像它是一个异常(不只是测试)?
- throw Error('msg') vs throw new Error('msg')
- 我应该如何复制字符串在Java?
- “while(true)”循环有那么糟糕吗?
- 这个方法签名中的省略号(…)是干什么用的?
- Java:如何测试调用System.exit()的方法?