java.lang.RuntimeException和java.lang.Exception之间的区别

cch*_*ion 191 java exception

有人请解释之间的差异java.lang.RuntimeExceptionjava.lang.Exception?如果我创建自己的异常,如何决定扩展哪一个?

And*_*ite 173

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

对于已检查的异常,您必须在可能抛出异常的代码周围放置一个try/catch块,或者向该方法添加一个"throws"子句,以指示该方法可能抛出此类异常(必须是在通话类或以上处理).

从"Exception"派生的任何异常都是一个经过检查的异常,而从RuntimeException派生的类是未经检查的.调用代码不需要显式处理RuntimeExceptions.

  • 实际上它确实"有两种类型的例外",但为什么Oracle文档说有三种类型.它将Error视为第3类型.我认为,Error根本不是Exception,它只是Throwable(对象),是的,它模仿了运行时异常的行为.你会怎么说呢?Oracle doc.REF.http://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html (3认同)
  • 错误并不意味着被捕获(尽管可能是)通常您在处理新代码时使用错误来捕获自己的错误.例如,如果你有一个树,如果if/elseif语句,最后的其他可能只是抛出错误("不希望这种情况发生"); 一般来说,异常具有支持发生的用例,而错误没有用例并且它们是错误. (3认同)
  • 但是笑话是RunTimeException本身扩展Exception:D(我知道这不会造成任何麻烦,JVM会处理整个上下文) (3认同)

fas*_*ava 158

通常,RuntimeExceptions是可以通过编程方式阻止的异常.例如 NullPointerException,ArrayIndexOutOfBoundException.如果null在调用任何方法之前检查,则NullPointerException永远不会发生.同样ArrayIndexOutOfBoundException,如果您首先检查该指数将永远不会发生.RuntimeException没有被编译器检查,所以它是干净的代码.

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

  • 我喜欢这种"调用者可以避免运行时异常"的角度.这意味着你(作为方法的调用者)应该确保它们甚至不会发生.检查过的异常是您无法避免的事情,而是事后需要处理它们.(是的,因为不是每个人都同意检查异常的概念,并且许多人对所有事情使用RuntimeException,这种区别变得有点混乱). (9认同)
  • 现在人们也喜欢未经检查的RuntimeException,因为它与Java 8 Lambda处理兼容,而Exception类型的已检查异常则不然. (4认同)
  • 我怀疑人们捕获“ RuntimeException”的真正原因是因为它很简单,并且不需要考虑已检查和未检查的异常之间的区别。我认为捕获运行时异常是一个糟糕的主意,因为您将捕获诸如NullPointerException之类的不可恢复的异常。 (2认同)

GAJ*_*E82 86

在查看java.lang.RuntimeExceptionjava.lang.Exception类之间的区别之前,您必须知道Exception层次结构.两个类ExceptionError类都派生自类Throwable(派生自类Object).这个班RuntimeException是从班级派生出来的Exception.

所有例外都来自ExceptionRuntimeException.

源自的所有异常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?

未经检查的例外 - 争议:

如果可以合理地期望客户端从异常中恢复,则将其作为已检查的异常.如果客户端无法执行任何操作以从异常中恢复,请将其设置为未经检查的异常.

请注意,未经检查的异常是派生自RuntimeException的异常,并且已检查的异常是派生自的异常Exception.

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

运行时异常表示编程问题导致的问题,因此,无法合理地期望API客户端代码从它们恢复或以任何方式处理它们.这些问题包括算术异常,例如除以零; 指针异常,例如尝试通过空引用访问对象; 和索引异常,例如尝试通过索引太大或太小来访问数组元素.


Joe*_*ore 6

简而言之,如果您的客户端/用户可以从异常中恢复,则将其设为Checked Exception,如果您的客户端无法执行任何操作以从异常中恢复,则将其设为Unchecked RuntimeException。例如, RuntimeException 是一个编程错误,就像除以零一样,除了程序员自己之外,没有用户可以对此做任何事情,那么它就是一个RuntimeException


ibe*_*rck 5

从oracle文档中:

这是底线准则:如果可以合理地预期客户端将从异常中恢复,则将其设置为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常。

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

RuntimeExceptions类似于runtimeException的“通过无效使用api引起的异常”示例:IllegalStateException,NegativeArraySizeException,NullpointerException

使用“异常”,您必须明确地捕获它,因为您仍然可以做一些恢复的事情。异常示例包括:IOException,TimeoutException,PrintException ...