JVM是如何处理异常的

  JVM处理异常

  异常处理的两大组成要素是抛出异常和捕获异常.这两大要素共同实现程序控制流的非正常转移.

  抛出异常可分为显式和隐式两种.显式抛异常的主体是应用程序,指的是在程序中使用throw关键字,手动将异常实例抛出.

  隐式抛异常的主体则是Java虚拟机,它指的是Java虚拟机在执行过程中,碰到无法继续执行的异常状态,自动抛出异常.

  捕获异常则涉及三个代码块:

    1.try代码块:

      用来标记需要进行异常监控的代码

    2.catch代码块:

      try代码块之后,用以捕获try中触发的某种指定类型的异常.除声明所捕获异常的类型外,catch中还包含对应的异常处理逻辑.Java中,try后可有多个catch,以捕获不同的异常.JVM会从上至下匹配异常处理.因此,上一catch的异常类型不能覆盖后续,否则编译报错.

    3.finally代码块:

      用来声明一段必定运行的代码.设计初衷为避免跳过某些关键的清理代码,例如关闭已打开的系统资源等.

  异常类型

  RuntimeException和Error属于Java中非检查异常(unchecked exception).其它异常则为检查异常(checked exception).在Java语法中,所有的检查异常都需要程序显式捕获,或在方法声明中用throws关键字标注.通常情况下,程序中自定义的异常应为检查异常,以便最大化利用Java编译器的编译时检查.

  在构造异常实例时,Java 虚拟机便需要生成该异常的栈轨迹(stack trace)。该操作会逐一访问当前线程的 Java 栈帧,并且记录下各种调试信息,包括栈帧所指向方法的名字,方法所在的类名、文件名,以及在代码中的第几行触发该异常。

  在生成栈轨迹时,Java 虚拟机会忽略掉异常构造器以及填充栈帧的 Java 方法(Throwable.fillInStackTrace),直接从新建异常位置开始算起。此外,Java 虚拟机还会忽略标记为不可见的 Java 方法栈帧。总体而言,异常实例的构建十分昂贵。

  

猜你喜欢

转载自www.cnblogs.com/nyatom/p/9400123.html