《深入拆解Java虚拟机》学习笔记 Day05 之前学习中的遗忘点(类的加载)与java异常

116 阅读4分钟

字节流

可以分为输入流和输出流.

输入流又可以分为字节流和字符流.

Java的加载 链接 初始化 [类加载过程]

docs.oracle.com/javase/spec…

加载Loading

将字节码数据从不同的数据源读取到JVM中,并映射为JVM认可的数据结构[class对象]

该阶段是用户参与的,可以自定义类加载器,实现自己的类加载.

链接

是核心步骤,即把原始定义的类平滑的转化入JVM的运行过程.具体分为三步

验证verification

JVM 需要核验字节信息是符合 Java 虚拟机规范的,否则就被认为是 VerifyError,这样就防止了恶意信息或者不合规的信息危害 JVM 的运行,验证阶段有可能触发更多 class 的加载。

准备 preparation

创建类或接口中的静态变量,并初始化静态变量的初始值。 但这里的“初始化”和下面的显式初始化阶段是有区别的,侧重点在于分配所需要的内存空间,不会去执行更进一步的 JVM 指令。

解析Resolution

在这一步会将常量池中的符号引用(symbolic reference)替换为直接引用。在Java 虚拟机规范中,详细介绍了类、接口、方法和字段等各个方面的解析。

初始化 Initialization

这一步真正去执行类初始化的代码逻辑,包括静态字段赋值的动作,以及执行类定义中的静态初始化块内的逻辑,编译器在编译阶段就会把这部分逻辑整理好,父类型的初始化逻辑优先于当前类型的逻辑。

java异常

java异常基本概念

在 Java 语言规范中,所有异常都是 Throwable 类或者其子类的实例。

image.png

Error与Exception

Error

Error,涵盖程序不应捕获的异常。当程序触发 Error 时,它的执行状态已经无法恢复,需要中止线程甚至是中止虚拟机。

Exception

涵盖程序可能需要捕获并且处理的异常。Exception 有一个特殊的子类 RuntimeException,用来表示“程序虽然无法继续执行,但是还能抢救一下”的情况。例如的数组索引越界。

检查异常与非检查异常

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

java异常相关处理

异常处理的两大组成要素是抛出异常和捕获异常.

抛出异常

显示抛异常throw

即在程序中通过关键字throw来将异常抛出.

隐式抛异常

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

例如数组索引越界,就会自动抛出异常.

捕获异常 try catch finally

try 代码块:用来标记需要进行异常监控的代码。

catch 代码块:跟在 try 代码块之后,用来捕获在 try 代码块中触发的某种指定类型的异常。除了声明所捕获异常的类型之外,catch 代码块还定义了针对该异常类型的异常处理器。在 Java 中,try 代码块后面可以跟着多个 catch 代码块,来捕获不同类型的异常。Java 虚拟机会从上至下匹配异常处理器。因此,前面的 catch 代码块所捕获的异常类型不能覆盖后边的,否则编译器会报错。

finally 代码块:跟在 try 代码块和 catch 代码块之后,用来声明一段必定运行的代码。它的设计初衷是为了避免跳过某些关键的清理代码,例如关闭已打开的系统资源。 finally代码块的内容只有在finally代码中出现了异常才不会正常执行.

参考文章:gk.link/a/11V4M