怎敢精——jvm异常

异常的本质是一种控制权的转换,从抛异常的地方交给处理异常的地方。

异常出现原因

异常出现的原因通常由如下三个,对应的是java层面的运行时异常,编译期异常和错误

这三个分类一直很难懂是吧

  • athrow字节码被执行,这个对应编译期异常,是在文件编译成class的时候就可以检测到的,由开发人员自定义的异常,必须要对其进行处理
  • 虚拟机检测到的程序发生的异常情况,这些异常不是java某个类定义的或者某个开发人员定义的,而是虚拟机定义的,如除以零异常,空指针异常,数组越界异常,他们不要求程序员每次都要显示的处理,编译期也可以通过,这些是运行时异常。——————虚拟机还会抛出一种异常,属于错误,是不可继续执行程序的,如果是运行时异常,做了try catch处理,尽管有空指针,但是程序可以继续运行。error通常是无法继续了,如内存溢出
  • 第三种是异步异常,可能是jvm内部错误或者是调用了stop方法

总结:

编译器异常:非jvm层面定义的异常,由开发人员(包括jdk中包含的类的源码的开发人员)抛出去的异常

运行时异常:jvm层面定义的异常,如jvm规范中定义整数除以0会抛出异常

错误:与异常相对,错误通常不可处理,程序不能继续

异常处理和抛送

当异常在方法体内有对应处理的时候,则会处理,如果不能处理,则结束当前栈帧(方法结束除return的另一种方法),讲信息抛送到上一层,如果一直到顶端都没有处理的话,程序结束。

finally

jvm允许异常跑出去前执行一小段代码,我觉得这就是finally 后面也许会提及

异常处理分支

一个方法通常会配有零至多个异常处理器,异常处理器描述了作用范围,能处理的异常类型。抛出异常时会按序搜索这些异常处理器,如果都没有找到,就抛送给上一层。

猜你喜欢

转载自blog.csdn.net/a397525088/article/details/81561532