Answers:
通常,RuntimeExceptions是可以通过编程方式防止的异常。例如 NullPointerException
,ArrayIndexOutOfBoundException
。如果null
在调用任何方法之前进行检查,则NullPointerException
永远不会发生。ArrayIndexOutOfBoundException
如果您先检查索引,同样也不会发生。RuntimeException
不会由编译器检查,因此它是干净的代码。
编辑:这些天人们喜欢,RuntimeException
因为它产生干净的代码。这完全是个人选择。
RuntimeException
是因为它很简单,并且不需要考虑已检查和未检查的异常之间的区别。我认为捕获运行时异常是一个可怕的主意,因为您将捕获不可恢复的异常,例如NullPointerException
。
在Java中,有两种异常类型:已检查的异常和未检查的异常。必须通过代码显式处理已检查的异常,而无需显式处理未检查的异常。
对于已检查的异常,您必须在可能引发异常的代码周围放置try / catch块,或者在方法中添加“ throws”子句,以指示该方法可能会抛出这种类型的异常(必须是在调用类或更高级别中处理)。
从“ Exception”派生的任何异常都是已检查的异常,而从RuntimeException派生的类则未经检查。调用代码不需要显式处理RuntimeExceptions。
在查看java.lang.RuntimeException
和java.lang.Exception
类之间的区别之前,您必须了解Exception
层次结构。两个Exception
和Error
类都从类衍生的Throwable
(其从类派生Object
)。该类RuntimeException
是从class派生的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
可以引发RuntimeException,但方法声明不需要指定它引发RuntimeException。
该方法process
将引发一个已检查的异常,并且应该声明它将抛出一个MyException类型的已检查的异常,否则将引发编译错误。
上面的类定义也会影响使用Process类的代码。
该调用new Process().execute()
是有效的调用,其中,形式调用
new Process().process()
给出编译错误。这是因为客户端代码应采取步骤进行处理MyException
(例如,可以将try(catch)块中包含对process()的调用)。
来自未经检查的异常-争议:
如果可以合理预期客户端会从异常中恢复,请将其设置为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常。
请注意,未检查的异常是从派生的,RuntimeException
而检查的异常是从派生的Exception
。
RuntimeException
如果客户端无法采取任何措施从异常中恢复,为什么还要抛出a ?本文介绍:
运行时异常表示由编程问题引起的问题,因此,无法合理地期望API客户端代码从它们中恢复或以任何方式进行处理。这些问题包括算术异常,例如被零除;指针异常,例如尝试通过空引用访问对象;以及索引异常,例如尝试通过太大或太小的索引访问数组元素。
从oracle文档中:
这是底线准则:如果可以合理地预期客户端将从异常中恢复,则将其设置为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常。
运行时异常表示由编程问题导致的问题,因此,无法合理地期望API客户端代码从它们中恢复或以任何方式进行处理。
RuntimeExceptions类似于runtimeException的“通过无效使用api引起的异常”示例:IllegalStateException,NegativeArraySizeException,NullpointerException
使用“例外”,您必须明确地捕获它,因为您仍然可以做一些事情来恢复。异常示例包括:IOException,TimeoutException,PrintException ...
有两种类型的异常,如果您收到此类异常,则可以从检查的异常中恢复。运行时异常是无法恢复的,运行时异常是编程错误,程序员在编写代码时应注意这一点,继续执行此操作可能会导致错误的结果。运行时异常与违反前提条件ex有关。您有一个大小为10的数组,并且您尝试访问第11个元素,它将抛出ArrayIndexOutOfBoundException