代码之家  ›  专栏  ›  技术社区  ›  cchampion

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

  •  175
  • cchampion  · 技术社区  · 14 年前

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

    12 回复  |  直到 14 年前
        1
  •  143
  •   BBdev Developer    12 年前

    一般来说 运行时异常 例外情况 这可以通过编程来阻止。例如 NullPointerException , ArrayIndexOutOfBoundException . 如果你检查 null 在调用任何方法之前, 空指针异常 不会发生的。同样地 ArrayIndexOutOfBoundException 如果你先检查索引就不会发生。 RuntimeException 编译器没有检查,因此它是干净的代码。

    编辑 :现在人们喜欢 运行期异常 因为它产生的干净代码。这完全是个人的选择。

        2
  •  156
  •   Andy White    14 年前

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

    对于选中的异常,必须在可能引发异常的代码周围放置try/catch块,或者向该方法添加“throws”子句,以指示该方法可能引发此类异常(必须在调用类或更高级别中处理)。

    从“exception”派生的任何异常都是选中的异常,而从runtimeexception派生的类是未选中的。运行时异常不需要由调用代码显式处理。

        3
  •  77
  •   prashant GAJJE82    7 年前

    在看两者的区别之前 java.lang.RuntimeException java.lang.Exception 上课,你必须知道 Exception 等级制度。两个 例外 Error 类是从类派生的 Throwable (来源于班级 Object )还有班级 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 
    
        4
  •  39
  •   prashant GAJJE82    7 年前

    检查异常,不检查运行时异常。

    选中意味着编译器要求您处理catch中的异常,或声明您的方法为抛出该异常(或其超类之一)。

    通常,如果API的调用方希望处理异常,则抛出选中的异常;如果调用方通常无法处理异常,则抛出未选中的异常,例如某个参数出现错误,即编程错误。

        5
  •  15
  •   Manos Nikolaidis    7 年前

    运行时异常类(运行时异常及其子类)不受编译时检查的限制,因为编译器无法建立运行时异常不能发生的机制。(来自JLS)。

    在您设计的类中,您应该将 例外 并抛出 它是任何特殊情况的信号。这样做,您将显式地向 你的类的客户使用你的类可能抛出异常,他们必须 采取措施处理这些特殊情况。

    下面的代码片段解释了这一点:

    //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");
        }
    }
    

    在上面的类定义中 过程 方法 execute 可以 扔一个 运行期异常 但是方法声明不需要指定 它扔 运行期异常 .

    方法 process 抛出一个checked异常,它应该声明 将抛出一个类型为checked的异常 原始的异常 如果不这样做 编译错误。

    上面的类定义将影响使用 过程 上课也一样。

    呼叫 new Process().execute() 是一个有效的调用,其中 new Process().process() 给出编译错误。这是因为客户端代码应该 采取措施处理 MyException (假设对process()的调用可以包含在 一个try/catch块)。

        6
  •  9
  •   Community Reversed Engineer    7 年前

    Proper use of RuntimeException?

    Unchecked Exceptions -- The Controversy :

    如果客户可以合理预期 要从异常中恢复,请执行以下操作 检查异常。如果客户 不能做任何事情来恢复 例外,不检查 例外。

    注意,未经检查的异常是从 RuntimeException 而checked异常是从 Exception .

    为什么扔 运行期异常 如果客户端无法从异常中恢复?文章解释道:

    运行时异常表示问题 那是编程的结果 问题,因此,api客户端 不能合理地期望代码 从他们身上恢复或处理他们 无论如何。这些问题包括 算术异常,例如 除以零;指针异常, 比如试图访问一个对象 通过空引用;和索引 例外情况,例如试图 通过 索引太大或太小。

        7
  •  4
  •   iberck    11 年前

    来自Oracle文档:

    以下是底线准则:如果客户可以 希望从异常中恢复,请将其设为选中的异常。如果 客户端无法从异常中恢复,请将其设置为 未检查异常。

    运行时异常表示由 程序设计问题 因此,不能合理地期望api客户端代码从它们恢复或以任何方式处理它们。

    运行时异常类似于“无效使用API的异常”运行时异常的示例:illegalStateException、negativeArraySizeException、nullPointerException

    除了例外,您必须显式地捕获它,因为您仍然可以执行一些恢复操作。异常的例子有:IOException、TimeoutException、PrintException…

        8
  •  4
  •   Joe Almore    9 年前

    简单地说,如果您的客户机/用户可以从异常中恢复,那么将其设置为 选中的 例外 ,如果您的客户端无法从异常中恢复,请执行以下操作 未检查的 运行期异常 . 例如,RuntimeException是一个编程错误,就像被零除一样,除了程序员自己,没有用户可以对此做任何事情,那么它就是 运行期异常 .

        9
  •  3
  •   jayrhd    10 年前

    RuntimeException是Exception类的子类

    这是异常类的许多子类之一。RunTimeExtExchange是Java虚拟机正常运行期间可以抛出的那些异常的超类。方法不需要在其throws子句中声明runtimeexception的任何子类,这些子类可能在方法执行期间抛出,但未被捕获。

    神职人员是

    java.lang.Object对象

    ---java.lang.Throwable语言

    ----java.lang.exception异常

    ——————————————————————————————————java.lang.RuntimeException

        10
  •  0
  •   F.O.O    10 年前

    异常是处理应用程序流中意外事件的好方法。编译器未选中RuntimeException,但您可能更喜欢使用扩展Exception类的异常来控制API客户端的行为,因为它们需要捕获错误才能进行编译。也形成了良好的文档。

    如果要实现干净的接口,请使用继承将应用程序具有的不同类型的异常子类化,然后公开父异常。

        11
  •  0
  •   Bhagwati Malav    7 年前

    有两种类型的异常,如果遇到这种异常,可以从选中的异常中恢复。运行时异常是不可恢复的,运行时异常是编程错误,程序员在编写代码时应加以处理,继续执行可能会导致错误的结果。运行时异常与precondition ex冲突。您有一个大小为10的数组,并且您正试图访问第11个元素,它将抛出arrayindexoutofboundexception

        12
  •  0
  •   Aditya    6 年前
    1. 用户定义的异常可以是检查异常或未检查异常,这取决于它扩展到的类。

    2. 如果扩展到异常类,则用户定义的异常可以是自定义检查异常

    3. 如果用户定义的异常扩展到运行时异常类,则它可以是自定义的未检查异常。

    4. 定义类并使其成为异常或运行时异常的子级