运行时/已选中/未选中/错误/异常之间的差异

什么是运行时异常,什么是已检查/未检查异常以及错误/异常之间的区别。为什么会有这么多类型?相反,Java可以简单地遵循一个简单的设计(只是尝试/捕获所有类型)来处理程序中的异常情况?


答案 1

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

[图片由JavaTpoint提供]。

此处要记住三个关键类:、 和 。这些类可以分为两种类型:“已检查的异常”和“未检查的异常”。ThrowableExceptionErrorException

已检查异常:

  • 这些是扩展除 和 之外的类。ThrowableRuntimeExceptionError
  • 它们也被称为编译时异常,因为它们是在编译时检查的,这意味着编译器强制我们使用或在函数签名中指示它们来处理它们,并迫使我们在调用方中处理它们。try/catchthrows
  • 它们是以编程方式可恢复的问题,由代码控制之外的意外情况(例如数据库关闭,文件I / O错误,错误输入等)引起。
  • 示例:、等。IOExceptionSQLException

未选中的异常:

  • 扩展的类称为未经检查的异常。RuntimeException
  • 未选中的异常不是在编译时检查的,而是在运行时检查的,因此得名。
  • 它们也是以编程方式可恢复的问题,但与已检查的异常不同,它们是由代码流或配置中的错误引起的。
  • 示例:,, ,等ArithmeticExceptionNullPointerExceptionArrayIndexOutOfBoundsException
  • 由于它们是编程错误,因此可以通过良好/明智的编码来避免它们。例如,“除以零”产生一个 ,这可以通过对除数的简单检查来避免。同样,我们可以通过简单地检查参考文献来避免:甚至使用更好的技术ArithmeticExceptionNullPointerExceptionif (object != null)

错误:

  • Error指 无法恢复的情况,该情况未由 处理。try/catch
  • 示例:、、等。OutOfMemoryErrorVirtualMachineErrorAssertionError

为什么有这么多类型?

除了Stephen C的答案之外,我还想说:异常处理在Java中是一个相对昂贵的操作。我们不应该把所有的特殊情况都放在一个尝试/捕获块中。过度使用 try/catchs 可能会妨碍程序性能。

总之,应尽可能以编程方式处理 s。另一方面,我们无法处理 s,因此这些可能是存在许多类型异常的一些逻辑原因。ExceptionError


答案 2

可抛出是所有异常的顶部。在“可抛出”下,您有错误和异常。在 Exception 下面,你有 RuntimeException。

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

(有争议的部分答案)

存在可抛出,以便所有异常类型都有一个父级。你永远不应该声明你投掷了可投掷的,也永远不要抓住它(除非你真的真的知道你在做什么)。

存在错误表示运行时环境存在问题,即程序可能无法从中恢复的内容,例如格式不正确的类文件或 VM 内存不足。除非您真正知道自己在做什么,否则不应捕获错误。

异常作为所有非程序员错误的根目录存在(请参阅 RuntimeException 以了解此“异常”),例如由于磁盘已满而无法创建文件。不应抛出、抛出或捕获异常。如果您必须捕获异常,请确保您知道自己在做什么。

运行时异常的存在是为了指示所有程序员错误,例如越过数组的末尾或在 null 对象上调用方法。这些是你应该修复的事情,这样它们就不会引发异常 - 表明你,程序员,搞砸了代码。同样,除非您知道自己在做什么,否则您不应该抓住这些。


推荐