diff --git a/docs/java/basis/images/checked-exception.png b/docs/java/basis/images/checked-exception.png
new file mode 100644
index 00000000..f9e79e58
Binary files /dev/null and b/docs/java/basis/images/checked-exception.png differ
diff --git a/docs/java/basis/images/image-20211213102222601.png b/docs/java/basis/images/image-20211213102222601.png
index 560efd26..5984d685 100644
Binary files a/docs/java/basis/images/image-20211213102222601.png and b/docs/java/basis/images/image-20211213102222601.png differ
diff --git a/docs/java/basis/images/java-value-passing-01.png b/docs/java/basis/images/java-value-passing-01.png
index 7a282217..7aced204 100644
Binary files a/docs/java/basis/images/java-value-passing-01.png and b/docs/java/basis/images/java-value-passing-01.png differ
diff --git a/docs/java/basis/images/java-value-passing-02.png b/docs/java/basis/images/java-value-passing-02.png
index 3b36ae2a..8d961f17 100644
Binary files a/docs/java/basis/images/java-value-passing-02.png and b/docs/java/basis/images/java-value-passing-02.png differ
diff --git a/docs/java/basis/images/java-value-passing-03.png b/docs/java/basis/images/java-value-passing-03.png
index 2ef1b096..e2b5eb17 100644
Binary files a/docs/java/basis/images/java-value-passing-03.png and b/docs/java/basis/images/java-value-passing-03.png differ
diff --git a/docs/java/basis/images/java程序转变为机器代码的过程.png b/docs/java/basis/images/java程序转变为机器代码的过程.png
index 4449496e..c9dd8df9 100644
Binary files a/docs/java/basis/images/java程序转变为机器代码的过程.png and b/docs/java/basis/images/java程序转变为机器代码的过程.png differ
diff --git a/docs/java/basis/images/shallow&deep-copy.png b/docs/java/basis/images/shallow&deep-copy.png
index 2c33515f..625f67ca 100644
Binary files a/docs/java/basis/images/shallow&deep-copy.png and b/docs/java/basis/images/shallow&deep-copy.png differ
diff --git a/docs/java/basis/images/types-of-exceptions-in-java.drawio b/docs/java/basis/images/types-of-exceptions-in-java.drawio
new file mode 100644
index 00000000..f212b143
--- /dev/null
+++ b/docs/java/basis/images/types-of-exceptions-in-java.drawio
@@ -0,0 +1 @@
+
图片来自:https://simplesnippets.tech/exception-handling-in-java-part-1/
图片来自:https://chercher.tech/java-programming/exceptions-java
-在 Java 中,所有的异常都有一个共同的祖先 `java.lang` 包中的 `Throwable` 类。`Throwable` 类有两个重要的子类 `Exception`(异常)和 `Error`(错误)。`Exception` 能被程序本身处理(`try-catch`), `Error` 是无法处理的(只能尽量避免)。 +### Exception 和 Error 有什么区别? -`Exception` 和 `Error` 二者都是 Java 异常处理的重要子类,各自都包含大量子类。 +在 Java 中,所有的异常都有一个共同的祖先 `java.lang` 包中的 `Throwable` 类。`Throwable` 类有两个重要的子类: -- **`Exception`** :程序本身可以处理的异常,可以通过 `catch` 来进行捕获。`Exception` 又可以分为 受检查异常(必须处理) 和 不受检查异常(可以不处理)。 -- **`Error`** :`Error` 属于程序无法处理的错误 ,我们没办法通过 `catch` 来进行捕获 。例如,Java 虚拟机运行错误(`Virtual MachineError`)、虚拟机内存不够错误(`OutOfMemoryError`)、类定义错误(`NoClassDefFoundError`)等 。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。 +- **`Exception`** :程序本身可以处理的异常,可以通过 `catch` 来进行捕获。`Exception` 又可以分为 Checked Exception (受检查异常,必须处理) 和 Unchecked Exception (不受检查异常,可以不处理)。 +- **`Error`** :`Error` 属于程序无法处理的错误 ,我们没办法通过 `catch` 来进行捕获 。例如Java 虚拟机运行错误(`Virtual MachineError`)、虚拟机内存不够错误(`OutOfMemoryError`)、类定义错误(`NoClassDefFoundError`)等 。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。 -**受检查异常** +### Checked Exception 和 Unchecked Exception 有什么区别? -Java 代码在编译过程中,如果受检查异常没有被 `catch`/`throw` 处理的话,就没办法通过编译 。比如下面这段 IO 操作的代码。 +**Checked Exception** 即受检查异常,Java 代码在编译过程中,如果受检查异常没有被 `catch`/`throw` 处理的话,就没办法通过编译 。 - +比如下面这段 IO 操作的代码: + + 除了`RuntimeException`及其子类以外,其他的`Exception`类及其子类都属于受检查异常 。常见的受检查异常有: IO 相关的异常、`ClassNotFoundException` 、`SQLException`...。 -**不受检查异常** - -Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。 +**Unchecked Exception** 即 **不受检查异常** ,Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。 `RuntimeException` 及其子类都统称为非受检查异常,例如:`NullPointerException`、`NumberFormatException`(字符串转换为数字)、`ArrayIndexOutOfBoundsException`(数组越界)、`ClassCastException`(类型转换错误)、`ArithmeticException`(算术错误)等。 -### Throwable 类常用方法 + -- **`public String getMessage()`**:返回异常发生时的简要描述 -- **`public String toString()`**:返回异常发生时的详细信息 -- **`public String getLocalizedMessage()`**:返回异常对象的本地化信息。使用 `Throwable` 的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与 `getMessage()`返回的结果相同 -- **`public void printStackTrace()`**:在控制台上打印 `Throwable` 对象封装的异常信息 +### Throwable 类常用方法有哪些? -### try-catch-finally +- `String getMessage()`: 返回异常发生时的简要描述 +- `String toString()`: 返回异常发生时的详细信息 +- `String getLocalizedMessage()`: 返回异常对象的本地化信息。使用 `Throwable` 的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与 `getMessage()`返回的结果相同 +- `void printStackTrace()`: 在控制台上打印 `Throwable` 对象封装的异常信息 + +### try-catch-finally 如何使用? - **`try`块:** 用于捕获异常。其后可接零个或多个 `catch` 块,如果没有 `catch` 块,则必须跟一个 `finally` 块。 - **`catch`块:** 用于处理 try 捕获到的异常。 - **`finally` 块:** 无论是否捕获或处理异常,`finally` 块里的语句都会被执行。当在 `try` 块或 `catch` 块中遇到 `return` 语句时,`finally` 语句块将在方法返回之前被执行。 -**在以下 3 种特殊情况下,`finally` 块不会被执行:** - -1. 在 `try` 或 `finally`块中用了 `System.exit(int)`退出程序。但是,如果 `System.exit(int)` 在异常语句之后,`finally` 还是会被执行 -2. 程序所在的线程死亡。 -3. 关闭 CPU。 - -下面这部分内容来自 issue: