运行时/已检查/未检查/错误/异常之间的差异

Jav*_*ser 23 java exception-handling exception runtimeexception checked-exceptions

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

Raz*_*zib 34

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

[图片由JavaTpoint提供 ].

有三个重点班在这里要记住:Throwable,ExceptionError.这些类Exception中可以分为两种类型:"Checked Exception"和"Unchecked Exception".

检查异常:

  • Throwable除了RuntimeException和之外,这些是扩展的类Error.
  • 它们也称为编译时异常,因为它们在编译时被检查,这意味着编译器强制我们处理它们try/catch或在函数签名中指出throws它们并强制我们在调用者中处理它们.
  • 它们是程序可恢复的问题,这些问题是由代码控制之外的意外情况引起的(例如数据库关闭,文件I/O错误,输入错误等).
  • 例如: IOException,SQLException,等.

未经检查的例外情况:

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

错误:

  • Error指的是一个无法处理的不可恢复的情况try/catch.
  • 例如: OutOfMemoryError,VirtualMachineError,AssertionError,等.

为什么这么多类型?

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

总之,Exception应尽可能以编程方式处理s.另一方面,我们无法处理Errors,因此这可能是为什么有许多类型的异常的一些逻辑原因.

  • +1为漂亮的照片。旁注:“错误”不可捕获并非严格正确。没有人会阻止您编写`try {sometching(); } catch(Error e){}`,但这实际上是个坏主意(有关详细信息,请参见[@TofuBeer的回答](/sf/answers/221404151/))。 (2认同)

Tof*_*eer 33

除了所有例外,Throwable都是最重要的.在Throwable下面你有错误和异常.在Exception下面你有RuntimeException.

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

(有争议的部分答案)

存在Throwable,因此所有异常类型都有父级.你永远不应该声明你扔掉了Throwable并且永远不会抓住它(除非你真的真的知道你在做什么).

存在错误表示运行时环境存在问题,程序可能无法从中恢复,例如格式错误的类文件或内存不足的VM.除非你真的知道自己在做什么,否则不应该发现错误.

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

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