try-catch-finally 朴灿烈づ我的快乐病毒、 2024-03-23 22:33 60阅读 0赞 #### 1、try-catch-finally #### 在Java程序中,有两种异常处理方法,一种是直接抛出异常(throws Exception),另一种是捕获异常内部处理(try-catch-finally) `try-catch-finally` 是一种在程序中处理异常的语句块。它的结构如下: try { // 可能会发生异常的代码 } catch (exception) { // 异常处理代码 } finally { // 无论是否发生异常,都会执行的代码 } 在 `try` 块中,你可以放置可能会引发异常的代码。如果在 `try` 块中发生了异常,那么程序会立即跳转到 `catch` 块,执行异常处理代码。`catch` 块中的 `exception` 参数是一个表示异常信息的对象,你可以使用它来获取有关异常的详细信息。 不管是否发生了异常,`finally` 块中的代码总是会被执行。它通常用于释放资源或执行必要的清理操作。即使在 `catch` 块中使用了 `return` 语句,`finally` 块中的代码也会被执行。 #### 2、try-catch-finally 中那个部分可以省略? #### `try-catch-finally` 中那个部分可以省略? 可以省略`catch`或者`finally`,但是`catch`和`finally`不可以同时省略。 即有三种组成方式:`try-catch` `try-finally` `try-catch-finally` #### 3、实战 #### ##### 3.1 无异常 ##### 可以看到,代码如果没有出现异常,执行顺序就是 `try ---》finally` @Test public void test(){ try { System.out.println("try------可能出现异常的代码"); } catch (Exception e) { e.printStackTrace(); System.out.println("catch-------出现异常"); } finally { System.out.println("finally-------最终执行的代码"); } } 结果 ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HpvMAIa7-1691975612483)(E:\\PRD\\Images\\image-20230812093521383.png)\]][img-HpvMAIa7-1691975612483_E_PRD_Images_image-20230812093521383.png] ##### 3.2 出现异常 ##### 代码中如果抛出了一场,那么执行顺序就是 `try ---》catch ---》finally` @Test public void test(){ try { // 可能抛出异常的代码 System.out.println("try------可能出现异常的代码"); int i = 5/0; // 异常代码,会报算数异常 System.out.println("输出内容:" + i); // 上一步抛出异常了,这里不会执行 } catch (Exception e) { // 处理异常 System.err.println("catch------捕获到了异常: " + e.getMessage()); } finally { // 无论是否发生异常都会执行的代码 System.out.println("finally-------最终执行的代码"); } } 结果 ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FPPWoGEV-1691975612485)(E:\\PRD\\Images\\image-20230812093736856.png)\]][img-FPPWoGEV-1691975612485_E_PRD_Images_image-20230812093736856.png] #### 4、使用return返回顺序和结果 #### ##### 4.1 try - catch 执行结果 ##### 可以看到`try - catch`里面都执行了`return`语句,如果出现异常了,那么`return`返回的就是`catch`块里面的`return`语句。 @Test public void test(){ System.out.println(test1()); } public String test1(){ try { // 可能抛出异常的代码 System.out.println("try------可能出现异常的代码"); // 第一步 int i = 5/0; // 异常代码,会报算数异常 System.out.println("输出内容:" + i); // 上一步抛出异常了,这里不会执行 return "return--返回--try"; } catch (Exception e) { // 处理异常 System.err.println("catch------捕获到了异常: " + e.getMessage()); // 第二步 return "return--返回--catch"; // 第三步 } } 结果 ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gD7CmZ6Q-1691975612485)(E:\\PRD\\Images\\image-20230812105825173.png)\]][img-gD7CmZ6Q-1691975612485_E_PRD_Images_image-20230812105825173.png] ##### 4.2 try - finally 执行结果 ##### 可以看到`try - finally`里面都执行了`return`语句,最终执行的`return`是`finally`中的`return`语句。 @Test public void test(){ System.out.println(test1()); } public String test1(){ try { // 可能抛出异常的代码 System.out.println("try------可能出现异常的代码"); // 第一步 return "return--返回--try"; } finally { // 无论是否发生异常都会执行的代码 System.out.println("finally-------最终执行的代码");; // 第二步 return "return--返回--finally"; // 第三步 } } 结果 ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AS9CMlTO-1691975612485)(E:\\PRD\\Images\\image-20230812110200857.png)\]][img-AS9CMlTO-1691975612485_E_PRD_Images_image-20230812110200857.png] ##### 4.3 try - catch - finally 执行结果 ##### **未出现异常** 当未出现异常的时候,是不会进入到catch块中的,所以执行顺序和`try - finally`是一样的 @Test public void test() { System.out.println(test1()); } public String test1() { try { // 可能抛出异常的代码 System.out.println("try------可能出现异常的代码"); // 第一步 return "return--返回--try"; } catch (Exception e) { // 处理异常 System.err.println("catch------捕获到了异常: " + e.getMessage()); return "return--返回--catch"; } finally { // 无论是否发生异常都会执行的代码 System.out.println("finally-------最终执行的代码"); // 第二步 ; // 第二步 return "return--返回--finally"; // 第三步 } } 结果 ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LHLZWQv5-1691975612486)(E:\\PRD\\Images\\image-20230812111615368.png)\]][img-LHLZWQv5-1691975612486_E_PRD_Images_image-20230812111615368.png] **出现异常** 可以看到执行顺序是`try - catch -finally`,但是`return`最终返回的还是`finally`中的`return`语句。 所以只要`finally`中有`return`语句,不管`try`或`catch`中是否有`return`语句,最终返回的`return`语句都是以`finally`中的为准。 @Test public void test() { System.out.println(test1()); } public String test1() { try { // 可能抛出异常的代码 System.out.println("try------可能出现异常的代码"); // 第一步 int i = 5/0; // 异常代码,会报算数异常 System.out.println("输出内容:" + i); // 上一步报错了,这里不会执行 return "return--返回--try"; } catch (Exception e) { // 处理异常 System.err.println("catch------捕获到了异常: " + e.getMessage()); // 第二步 return "return--返回--catch"; } finally { // 无论是否发生异常都会执行的代码 System.out.println("finally-------最终执行的代码"); // 第三步 ; // 第二步 return "return--返回--finally"; // 第四步 } } 结果 ![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LrNW44k9-1691975612486)(E:\\PRD\\Images\\image-20230812111900812.png)\]][img-LrNW44k9-1691975612486_E_PRD_Images_image-20230812111900812.png] #### 5、总结 #### 1. try块:try块中包含希望监控的代码片段。在执行try块时,如果发生异常,那么异常会被抛出并捕获,程序的控制流会跳转到与之对应的catch块。 2. catch块:catch块用于捕获和处理异常。catch块中声明的异常类型决定了捕获哪些类型的异常。当try块中发生与catch块声明的异常类型匹配的异常时,程序会进入相应的catch块中执行处理逻辑。 3. finally块:finally块中的代码无论是否发生异常,都会被执行。它通常用于释放资源或进行一些必要的清理操作。即使在try块或catch块中遇到return语句,finally块仍然会在方法返回之前执行。 try-catch-finally结构的执行顺序为:先执行try块中的代码,如果异常被捕获,执行对应的catch块,最后执行finally块中的代码。如果在try块中的代码发生异常时没有被捕获,异常会传递给上层调用者,并在调用栈中继续寻找匹配的异常处理机制。 [img-HpvMAIa7-1691975612483_E_PRD_Images_image-20230812093521383.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/14/6d431445b6f141d8b438408b1dd56c85.png [img-FPPWoGEV-1691975612485_E_PRD_Images_image-20230812093736856.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/14/6c1141db62054c0091594139b7b53623.png [img-gD7CmZ6Q-1691975612485_E_PRD_Images_image-20230812105825173.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/14/f87404aa668d4135a73fbffb3d354014.png [img-AS9CMlTO-1691975612485_E_PRD_Images_image-20230812110200857.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/14/2eb493c689cc4aa2926e21124aac1616.png [img-LHLZWQv5-1691975612486_E_PRD_Images_image-20230812111615368.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/14/eaf7a14f30b94533a258f0fe5a5919eb.png [img-LrNW44k9-1691975612486_E_PRD_Images_image-20230812111900812.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/14/ca404ebe907c4ff5af0ce9af47e1792b.png
还没有评论,来说两句吧...