Java中的异常

Published: 02 Sep 2015 Category: java

10月23日才补上这部分,可见我的拖延症有多严重!

1. Java 异常基本知识

所有的异常都是Throwable的子类。

2. 三种异常的区别:

  • RuntimeException 表示这种异常是否出现经常不可预料,出现了的话,就中止处理。

  • Error 一般表示无法恢复的故障,也就是你再试一次依然会出错,比如 OutOfMemoryError,试多少次很大概率出错的。

  • Exception 则表示一般性的异常,而且这种异常是设计中早已考虑到很常见的错误,并且一定要求在设计中说明如果处理这种异常。

技术上讲,Error/RuntimeException 和 Exception 仅是 unchecked 和 checked 这种编译过程上不同,它们的主要区别还是在设计时它的重要程序及处理例程。 (checked exception,需查异常,即用throws关键字声明的异常)

不需查异常用RuntimeException的子类来表示,表明了程序的错误,因此得到这类异常的时候,通常要考虑修改你的代码了。

不需查异常同Error及其子类并无本质的区别,只不过Error及其子类是由Java虚拟机使用。而RuntimeException及其子类由程序员使用。

系统级的异常(Error)指一些绝对不应该发生的错误,如果发生,在应用程序中进行恢复通常是不可能的。应该程序不应该也不必要声明和抛出Error的子类,也不必试图捕获Error的子类。

3. 异常对性能的影响

  1. 异常的创建、捕获和处理都需要很高的代价。 在JVM处理异常的过程中,每一层方法调用,都会生成一帧来存储方法的相关信息,包括局部变量、参数、返回值和代码信息等。 整个过程要比正常流程付出更多的代价。
  2. 即便没有异常发生,包含异常处理的代码仍然需要较多的运行时间(特别是finally包含的地方,总是会被执行到)