14

什么是运行时异常以及什么是Checked/Unchecked Exceptions和Error/Exception之间的区别。为什么这些类型很多?相反,Java可以简单地遵循一个简单的设计(只是尝试/捕获所有类型)来处理程序中的异常情况?Runtime/Checked/Unchecked/Error/Exception之间的差异

+0

您是否阅读过[Sun Java教程异常教程](http://java.sun.com/docs/books/tutorial/essential/exceptions/)?这可能是一个很好的开始。 – 2010-07-02 02:21:34

回答

27

Throwable处于所有例外状态。 Underneath Throwable你有错误和异常。 在异常下有RuntimeException。

Java有两种类型的异常 - 选中和未选中。检查异常是由编译器执行的(你必须在throws子句中声明它们并最终捕获它们)。未检查的异常不会强制捕获或在throws子句中声明。

(答案中有争议的部分)

Throwable的存在,以便有所有的异常类型的父母。你永远不应该声明你抛出Throwable并且永远不会捕获它(除非你真的真的知道你在做什么)。

指示运行时环境的问题存在错误,您的程序可能无法从中恢复,例如格式错误的类文件或内存不足的虚拟机。除非你真的知道你在做什么,否则你不应该发现一个错误。

作为所有非程序员错误的根存在异常(请参阅RuntimeException中的“异常”),例如由于磁盘已满而无法创建文件。您不应该抛出,抛出或捕获异常。如果你必须赶上例外,请确保你知道你在做什么。

RuntimeException存在以指示所有程序员错误,例如超过数组末尾或调用空对象上的方法。这些是你应该修复的东西,以便它们不会抛出异常 - 表明你,程序员,搞砸了代码。再说一遍,除非你知道你在做什么,否则你不应该抓住这些。

3

@ TofuBeer的回答清楚地解释了异常类的含义。

Why these many types? Instead Java may simply follow a simple design(just try/catch all types) to handle an abnormal condition in a program?

为什么?因为他们是必要的!如果没有这四类,处理大类的例外将是不切实际的。

  • 如果没有Error类,你会如何捕获“所有致命的JVM错误”?
  • 如何在没有Exception类的情况下捕获“不是JVM致命错误的所有异常”?
  • 如果没有RuntimeException课程,你会如何捕获“所有未经检查的例外”?
0

运行时异常为您提供了避免捕获,声明异常的灵活性。

+2

是的,好像不捕捉异常,只是让它杀死线程是一个可接受的解决方案。 – Bombe 2011-02-13 10:57:51

+0

在某些情况下,它是。 – Sid 2011-02-13 19:04:00

+0

它通常被认为是一个糟糕的想法®来产生你自己的RuntimeException。小心这样做,而不仅仅是一条捷径。 – 2015-03-16 13:50:10

16

由于我是一名新的Java开发人员,因此在区分和处理不同类型的异常方面也面临一些困难。这就是为什么我在这个话题上做了一个简短的记录,每当我感到困惑的时候,我都会通过它。在这里它与所述Throwable类层次的图像:
Throwable Class Hierarchy

[的JavaTpoint图像礼貌]。

在这里有三个关键类别要记住:Throwable,ExceptionError。在这些类别中,Exception可以分为两种类型:“检查异常”和“未检查异常”。

经过例外:

  • 这些是延伸Throwable除了RuntimeExceptionError的类。
  • 它们也被称为编译时异常,因为它们在编译时被检查,这意味着编译器迫使我们或者用try/catch来处理它们,或者在函数签名中指示它们throws它们并迫使我们在调用者中处理它们。
  • 它们是由代码控制之外的意外情况(例如数据库故障,文件I/O错误,错误输入等)引起的程序可恢复问题。
  • 实施例:IOExceptionSQLException

未经检查的异常:

  • 延伸RuntimeException被称为未检查异常的类。
  • 在编译时未检查未检查的异常,而是在运行时检查,因此是名称。
  • 它们也是编程上可恢复的问题,但不像检查异常它们是由代码流或配置中的错误引起的。
  • 实施例:ArithmeticExceptionNullPointerExceptionArrayIndexOutOfBoundsException
  • 由于它们的编程错误,它们可以通过很好地/明智编码来避免。例如“除以零”产生一个ArithmeticException,这可以通过对除数的简单检查来避免。同样,我们可以通过简单检查参考文献if (object != null)或甚至使用better techniques来避免NullPointerException

错误:

  • Error是指没有被一个try/catch处理无法挽回的局面。
  • 例子:OutOfMemoryErrorVirtualMachineErrorAssertionError

为什么这么多的类型?

除了Stephen C的回答我想说的是: 异常处理是一个相对昂贵的Java操作。 我们不应该把所有异常情况放在try/catch区块。过度使用try/catch可能会妨碍程序性能。

最后,Exception应尽可能以编程方式处理。另一方面,我们不能处理Error,所以这些可能是为什么有很多类型的例外的一些合乎逻辑的原因。

+0

为好的图片+1。旁注:“错误”不可捕捉是不正确的。没有人阻止你写'try {sometching(); } catch(Error e){}',但这样做确实是一个坏主意(详情请参阅[@ TofuBeer的回答](https://stackoverflow.com/a/3162916/2448440))。 – Qw3ry 2017-09-01 07:49:34

0
  • 错误(由虚拟机抛出,不应该被捕获或处理)
    1. VM错误
    2. 断言错误
    3. 链接错误......等等
  • 运行/不选异常(编程错误,不应被捕获或处理)
    1. NullPointerException异常
    2. ArrayIndexOutOfBoundException
    3. 抛出:IllegalArgumentException ......等等
  • 检查异常(别的,有望应用到被捕获或处理)
    1. IOException异常
    2. FileNotFoundException异常
    3. 的SQLException ...等等