有人请解释之间的差异java.lang.RuntimeException和java.lang.Exception?如果我创建自己的异常,如何决定扩展哪一个?
And*_*ite 173
在Java中,有两种类型的异常:已检查异常和未经检查的异常.必须由代码显式处理已检查的异常,而不需要显式处理未经检查的异常.
对于已检查的异常,您必须在可能抛出异常的代码周围放置一个try/catch块,或者向该方法添加一个"throws"子句,以指示该方法可能抛出此类异常(必须是在通话类或以上处理).
从"Exception"派生的任何异常都是一个经过检查的异常,而从RuntimeException派生的类是未经检查的.调用代码不需要显式处理RuntimeExceptions.
fas*_*ava 158
通常,RuntimeExceptions是可以通过编程方式阻止的异常.例如 NullPointerException,ArrayIndexOutOfBoundException.如果null在调用任何方法之前检查,则NullPointerException永远不会发生.同样ArrayIndexOutOfBoundException,如果您首先检查该指数将永远不会发生.RuntimeException没有被编译器检查,所以它是干净的代码.
编辑:这些天人们喜欢RuntimeException它,因为它产生了干净的代码.这完全是个人选择.
GAJ*_*E82 86
在查看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
Run Code Online (Sandbox Code Playgroud)
Law*_*Dol 43
检查Exception,并取消选中RuntimeException.
Checked意味着编译器要求您在catch中处理异常,或者将您的方法声明为抛出它(或其中一个超类).
通常,如果期望API的调用者处理异常,则抛出已检查的异常,如果调用者通常无法处理异常,则抛出未经检查的异常,例如带有其中一个参数的错误,即编程错误.
sat*_*esh 15
运行时异常类(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");
}
}
Run Code Online (Sandbox Code Playgroud)
在上面类Process的类定义中,该方法execute可以抛出RuntimeException,但方法声明不需要指定它抛出RuntimeException.
该方法process抛出一个已检查的异常,它应该声明它将抛出一个MyException类型的已检查异常,而不这样做将是一个编译错误.
上面的类定义也会影响使用Process类的代码.
该调用new Process().execute()是一个有效的调用,其中form的调用
new Process().process()给出了编译错误.这是因为客户端代码应该采取措施来处理MyException(比如调用process()可以包含在try/catch块中).
Mah*_*ili 11
如果可以合理地期望客户端从异常中恢复,则将其作为已检查的异常.如果客户端无法执行任何操作以从异常中恢复,请将其设置为未经检查的异常.
请注意,未经检查的异常是派生自RuntimeException的异常,并且已检查的异常是派生自的异常Exception.
RuntimeException如果客户端无法从异常中恢复,为什么抛出?文章解释说:
运行时异常表示编程问题导致的问题,因此,无法合理地期望API客户端代码从它们恢复或以任何方式处理它们.这些问题包括算术异常,例如除以零; 指针异常,例如尝试通过空引用访问对象; 和索引异常,例如尝试通过索引太大或太小来访问数组元素.
简而言之,如果您的客户端/用户可以从异常中恢复,则将其设为Checked Exception,如果您的客户端无法执行任何操作以从异常中恢复,则将其设为Unchecked RuntimeException。例如, RuntimeException 是一个编程错误,就像除以零一样,除了程序员自己之外,没有用户可以对此做任何事情,那么它就是一个RuntimeException。
从oracle文档中:
这是底线准则:如果可以合理地预期客户端将从异常中恢复,则将其设置为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常。
运行时异常表示由编程问题引起的问题,因此,无法合理地期望API客户端代码从它们中恢复或以任何方式进行处理。
RuntimeExceptions类似于runtimeException的“通过无效使用api引起的异常”示例:IllegalStateException,NegativeArraySizeException,NullpointerException
使用“异常”,您必须明确地捕获它,因为您仍然可以做一些恢复的事情。异常示例包括:IOException,TimeoutException,PrintException ...
| 归档时间: |
|
| 查看次数: |
193082 次 |
| 最近记录: |