有人能解释一下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
在了解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
有两种类型的异常,如果你得到这种类型的异常,你可以从检查异常恢复。运行时异常是不可恢复的,运行时异常是编程错误,程序员应该在编写代码时注意它,继续执行这个可能会给你不正确的结果。运行时异常是关于违反先决条件的,例如,你有一个大小为10的数组,并且你试图访问第11个元素,它将抛出ArrayIndexOutOfBoundException
用户定义异常可以是已检查异常或未检查异常,这取决于它扩展到的类。 用户定义异常可以是自定义检查异常,如果它扩展到异常类 用户定义异常可以是自定义未检查异常,如果它扩展到运行时异常类。 定义一个类,并使其成为异常或运行时异常的子类
简单地说,如果你的客户端/用户可以从异常中恢复,那么将其设置为Checked Exception,如果你的客户端不能从异常中恢复,那么将其设置为Unchecked RuntimeException。例如,RuntimeException是一个编程错误,就像除零一样,除了程序员自己,没有用户可以做任何事情,那么它就是一个RuntimeException。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap