Skip to content

Commit b833a8d

Browse files
committed
[docs update]完善异常这部分内容的介绍
1 parent c25ab9c commit b833a8d

12 files changed

+94
-35
lines changed
37.6 KB
Loading
Loading
-2.5 KB
Loading
-8.13 KB
Loading
-8.24 KB
Loading
Loading
-7.99 KB
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile host="Electron" modified="2022-01-30T07:12:58.695Z" agent="5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.4.5 Chrome/83.0.4103.122 Electron/9.1.0 Safari/537.36" etag="e6cfDzwHOZ-OtEea5Rce" version="13.4.5" type="device"><diagram id="mPrK13Eo7WhzfbSKrwnZ" name="Page-1">7Vtdd6M2EP01PGaPkQDjR3+m6Uma9Djbdh9lEIZGRq6QY7u/vhIWNiDsOE0M3l2OH4xGQkJzZ0Z3JDDgcLG5ZWgZPlAfEwN0/I0BRwYAZte2xZ+UbJWkA82dZM4iX8kOgmn0L84aKukq8nFSaMgpJTxaFoUejWPs8YIMMUbXxWYBJcVRl2iONcHUQ0SX/hn5PNxJXdA9yH/B0TzMRjad3q5mgbLGaiZJiHy6zong2IBDRinfXS02Q0yk9jK97O6bHKndPxjDMT/nhmA0jm55TBZxH94/P8EpHPdvLPVsfJtNGPti/qpIGQ/pnMaIjA/SAaOr2Mey144oHdrcU7oUQlMI/8acbxWYaMWpEIV8QVSteGC2/Uve/8XOit9Ud2lhtCmUtqoU0JirTk1XlPcalZXJC+ZeqEbYzUpO5aiylCihK+bhExrKjA6xOeYn2oE9pMIZMF1g8eTiPoYJ4tFr8TmQMsr5vp26tc8Y2uYaLGkU8yTX85MUiAbKwaCjjEu5FyzbQKm9e7K5uNg9QFbKzeQgSs3qHSZmN2FiZVP5vyZ3VSYGvwcTc8wGbExN+hWRlVLDcyhiP5oJaypb38G2JIzrMOJ4ukQpQGuxiJ22oyAiZEgJZWlf0EfYDTxpGpzRF5yrcTwXz4IzLOgVM443p21IxzwDp1NUNrBUeX1Yq8xsAQpz61QGapWZ5KB6PxIAXIO71+K24NyVoVON4dl++zFAYCNL/CbiuXArSt9yNYdgKwuNLu9ng3jEEWsCUYtv442Hlzyi8WXjm41d36qKby6YQce5dHwDpbXEaTq8OT9NdPsUsvEmO7A7JaR2jqjuKoH1CUQB6o4kkkR2UScKXA97lSRh5tqWfQ7N/JAT2fa1eVFXQ+GHBsDqHTH6HAB75pYHANiXQqCnIfC44o/BA15Qtq12CTF/XlR7UZ0xjXFJ90qESDSPRdET+sJCPpDajDxE+qpiEfl+GiqrcC6Gz/fGwo95jmkXgYMVntOrAu5SuGXhMwfcHxHjK0QekBdGMW6xO4adYzeNnZ6lTjnyXh7FPCeErlvojkDnVMTLmqGzNOjuHlu8juDVNRvHy36bYeDY78sDggMAPkrCPeXIASjlT4gLUOJUAjpwD2t2KAAuwtN1ledUaldoNJN9Mk3vlmn6Ln3QaPqbHTllTnlhvi9wKBtCP0mkX9G49d9j8bZxmmM1cmjwXZ1LZbp/e+fKrga/pp0rnbAOQ+y9CJxAp55NrCAIQHX65zszx774JtaNWc7/KtbH/YF3LQm41Z77vulfZx/8Oo36l55UfI292j0MO0c8rNubdS6+wWJa1+Zg4AwC+kPFONApcYiKTcbqPS7rYhg4dWPQsBeA64NA3+kVefPRmPQTcm+RoZQypF7T5BvoOdOQoCT5jfKJVFSL3yn8uo0nT0Df3J/+ft+idhK1btOoQT1RmkQEt053Dnxu1ZFmvfDpJ8saUu2OY26E0kbhjVskL2756PPcHUeto7rfMNCPCvos4qHoN/JaLz6RtTXPfKCetaXMZ4gS3kJ3ArrmSQ/Uk707QvAckeeQYeRPOeK4xTCPoX11FEgnrndCO5v01ZSB1FTSIngCwf2a2dy5DWhZ0EdYELCsL5/Egyq6qpkJWRX7b2PbEPysPzTGljEYGr1uKpkYA3ExSSX9X9ErupVf/RnAIdKlZ6xgQM4/K/nJXIr6TZLC3hcNTGe5SRHO6sXVPP2XQ42MnhjTNUTeIMbPhtoNI56gB42+fuR4HSGFoBkmA+S9zFN5efCc7TuqnNt5HKS/tE+xAMq4CUcy1bzAq9olSmBVvQTiVriO+f5gJIqH7yZ35nr4/BSO/wM=</diagram></mxfile>
Loading
187 KB
Loading
Loading

docs/java/basis/java基础知识总结.md

+93-35
Original file line numberDiff line numberDiff line change
@@ -1226,77 +1226,135 @@ JDK 提供了很多内置的注解(比如 `@Override` 、`@Deprecated`),
12261226

12271227
## 异常
12281228

1229-
### Java 异常类层次结构图
1229+
**Java 异常类层次结构图概览**
1230+
1231+
![types-of-exceptions-in-java](/Users/guide/Documents/GitHub/JavaGuide/docs/java/basis/images/types-of-exceptions-in-java.png)
12301232

1231-
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-12/Java%E5%BC%82%E5%B8%B8%E7%B1%BB%E5%B1%82%E6%AC%A1%E7%BB%93%E6%9E%84%E5%9B%BE.png)
12321233

1233-
<p style="font-size:13px;text-align:right">图片来自:https://simplesnippets.tech/exception-handling-in-java-part-1/</p>
12341234

12351235
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-12/Java%E5%BC%82%E5%B8%B8%E7%B1%BB%E5%B1%82%E6%AC%A1%E7%BB%93%E6%9E%84%E5%9B%BE2.png)
12361236

12371237
<p style="font-size:13px;text-align:right">图片来自:https://chercher.tech/java-programming/exceptions-java</p>
12381238

1239-
在 Java 中,所有的异常都有一个共同的祖先 `java.lang` 包中的 `Throwable` 类。`Throwable` 类有两个重要的子类 `Exception`(异常)和 `Error`(错误)。`Exception` 能被程序本身处理(`try-catch`), `Error` 是无法处理的(只能尽量避免)。
1239+
### ExceptionError 有什么区别?
12401240

1241-
`Exception``Error` 二者都是 Java 异常处理的重要子类,各自都包含大量子类。
1241+
在 Java 中,所有的异常都有一个共同的祖先 `java.lang` 包中的 `Throwable` 类。`Throwable` 类有两个重要的子类:
12421242

1243-
- **`Exception`** :程序本身可以处理的异常,可以通过 `catch` 来进行捕获。`Exception` 又可以分为 受检查异常(必须处理) 和 不受检查异常(可以不处理)。
1244-
- **`Error`**`Error` 属于程序无法处理的错误 ,我们没办法通过 `catch` 来进行捕获 。例如,Java 虚拟机运行错误(`Virtual MachineError`)、虚拟机内存不够错误(`OutOfMemoryError`)、类定义错误(`NoClassDefFoundError`)等 。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。
1243+
- **`Exception`** :程序本身可以处理的异常,可以通过 `catch` 来进行捕获。`Exception` 又可以分为 Checked Exception (受检查异常,必须处理) 和 Unchecked Exception (不受检查异常,可以不处理)。
1244+
- **`Error`**`Error` 属于程序无法处理的错误 ,我们没办法通过 `catch` 来进行捕获 。例如Java 虚拟机运行错误(`Virtual MachineError`)、虚拟机内存不够错误(`OutOfMemoryError`)、类定义错误(`NoClassDefFoundError`)等 。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。
12451245

1246-
**受检查异常**
1246+
### Checked Exception 和 Unchecked Exception 有什么区别?
12471247

1248-
Java 代码在编译过程中,如果受检查异常没有被 `catch`/`throw` 处理的话,就没办法通过编译 。比如下面这段 IO 操作的代码
1248+
**Checked Exception** 即受检查异常,Java 代码在编译过程中,如果受检查异常没有被 `catch`/`throw` 处理的话,就没办法通过编译 。
12491249

1250-
![check-exception](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/2020-12/check-exception.png)
1250+
比如下面这段 IO 操作的代码:
12511251

1252-
除了`RuntimeException`及其子类以外,其他的`Exception`类及其子类都属于受检查异常 。常见的受检查异常有: IO 相关的异常、`ClassNotFoundException``SQLException`...。
1252+
![](./images/checked-exception.png)
12531253

1254-
**不受检查异常**
1254+
除了`RuntimeException`及其子类以外,其他的`Exception`类及其子类都属于受检查异常 。常见的受检查异常有: IO 相关的异常、`ClassNotFoundException``SQLException`...。
12551255

1256-
Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。
1256+
**Unchecked Exception****不受检查异常**Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。
12571257

12581258
`RuntimeException` 及其子类都统称为非受检查异常,例如:`NullPointerException``NumberFormatException`(字符串转换为数字)、`ArrayIndexOutOfBoundsException`(数组越界)、`ClassCastException`(类型转换错误)、`ArithmeticException`(算术错误)等。
12591259

1260-
### Throwable 类常用方法
1260+
![](./images/unchecked-exception.png)
12611261

1262-
- **`public String getMessage()`**:返回异常发生时的简要描述
1263-
- **`public String toString()`**:返回异常发生时的详细信息
1264-
- **`public String getLocalizedMessage()`**:返回异常对象的本地化信息。使用 `Throwable` 的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与 `getMessage()`返回的结果相同
1265-
- **`public void printStackTrace()`**:在控制台上打印 `Throwable` 对象封装的异常信息
1262+
### Throwable 类常用方法有哪些?
12661263

1267-
### try-catch-finally
1264+
- `String getMessage()`: 返回异常发生时的简要描述
1265+
- `String toString()`: 返回异常发生时的详细信息
1266+
- `String getLocalizedMessage()`: 返回异常对象的本地化信息。使用 `Throwable` 的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与 `getMessage()`返回的结果相同
1267+
- `void printStackTrace()`: 在控制台上打印 `Throwable` 对象封装的异常信息
1268+
1269+
### try-catch-finally 如何使用?
12681270

12691271
- **`try`块:** 用于捕获异常。其后可接零个或多个 `catch` 块,如果没有 `catch` 块,则必须跟一个 `finally` 块。
12701272
- **`catch`块:** 用于处理 try 捕获到的异常。
12711273
- **`finally` 块:** 无论是否捕获或处理异常,`finally` 块里的语句都会被执行。当在 `try` 块或 `catch` 块中遇到 `return` 语句时,`finally` 语句块将在方法返回之前被执行。
12721274

1273-
**在以下 3 种特殊情况下,`finally` 块不会被执行:**
1275+
示例:
12741276

1275-
1.`try``finally`块中用了 `System.exit(int)`退出程序。但是,如果 `System.exit(int)` 在异常语句之后,`finally` 还是会被执行
1276-
2. 程序所在的线程死亡。
1277-
3. 关闭 CPU。
1277+
```java
1278+
try {
1279+
System.out.println("Try to do something");
1280+
throw new RuntimeException("RuntimeException");
1281+
} catch (Exception e) {
1282+
System.out.println("Catch Exception -> " + e.getMessage());
1283+
} finally {
1284+
System.out.println("Finally");
1285+
}
1286+
```
12781287

1279-
下面这部分内容来自 issue:<https://github.com/Snailclimb/JavaGuide/issues/190>
1288+
输出:
12801289

1281-
**注意:** 当 try 语句和 finally 语句中都有 return 语句时,在方法返回之前,finally 语句的内容将被执行,并且 finally 语句的返回值将会覆盖原始的返回值。如下:
1290+
```
1291+
Try to do something
1292+
Catch Exception -> RuntimeException
1293+
Finally
1294+
```
1295+
1296+
**注意:不要在 finally 语句块中使用 return!** 当 try 语句和 finally 语句中都有 return 语句时,try 语句块中的 return 语句不会被执行。
1297+
1298+
示例:
12821299

12831300
```java
1284-
public class Test {
1285-
public static int f(int value) {
1286-
try {
1287-
return value * value;
1288-
} finally {
1289-
if (value == 2) {
1290-
return 0;
1291-
}
1301+
public static void main(String[] args) {
1302+
System.out.println(f(2));;
1303+
}
1304+
1305+
public static int f(int value) {
1306+
try {
1307+
return value * value;
1308+
} finally {
1309+
if (value == 2) {
1310+
return 0;
12921311
}
12931312
}
12941313
}
12951314
```
12961315

1297-
如果调用 `f(2)`,返回值将是 0,因为 finally 语句的返回值覆盖了 try 语句块的返回值。
1316+
输出:
1317+
1318+
```
1319+
0
1320+
```
1321+
1322+
### finally 中的代码一定会执行吗?
1323+
1324+
不一定的!在某些情况下,finally 中的代码不会被执行。
1325+
1326+
就比如说 `finally` 之前虚拟机被终止运行的话,finally 中的代码就不会被执行。
1327+
1328+
```java
1329+
try {
1330+
System.out.println("Try to do something");
1331+
throw new RuntimeException("RuntimeException");
1332+
} catch (Exception e) {
1333+
System.out.println("Catch Exception -> " + e.getMessage());
1334+
// 终止当前正在运行的Java虚拟机
1335+
System.exit(1);
1336+
} finally {
1337+
System.out.println("Finally");
1338+
}
1339+
```
1340+
1341+
输出:
1342+
1343+
```
1344+
Try to do something
1345+
Catch Exception -> RuntimeException
1346+
```
1347+
1348+
另外,在以下 2 种特殊情况下,`finally` 块的代码也不会被执行:
1349+
1350+
1. 程序所在的线程死亡。
1351+
2. 关闭 CPU。
1352+
1353+
相关 issue: <https://github.com/Snailclimb/JavaGuide/issues/190>
1354+
1355+
🧗🏻进阶一下:从字节码角度分析`try catch finally`这个语法糖背后的实现原理。
12981356

1299-
### 使用 `try-with-resources` 来代替`try-catch-finally`
1357+
### 如何使用 `try-with-resources` 代替`try-catch-finally`
13001358

13011359
1. **适用范围(资源的定义):** 任何实现 `java.lang.AutoCloseable`或者 `java.io.Closeable` 的对象
13021360
2. **关闭资源和 finally 块的执行顺序:**`try-with-resources` 语句中,任何 catch 或 finally 块在声明的资源关闭后运行

0 commit comments

Comments
 (0)