• try catch finally注意事项


    1、概述

            try-catch-finally 语句是 Java 中常用的异常处理机制,其中 finally 块用于在 try 块和 catch 块执行完毕后执行一些必要的清理操作,例如释放资源、关闭文件等。在使用 try-catch-finally 语句时,需要注意以下几点:

    • finally 块中的代码必须执行
      • 无论 try 块和 catch 块是否发生异常,finally 块中的代码都会被执行。因此,在 finally 块中执行的代码应该是必须执行的,例如释放资源、关闭文件等。
    • finally 块中的代码不能抛出异常
      • 如果 finally 块中的代码抛出异常,那么整个 try-catch-finally 语句都会被中断,异常会被抛出到上级调用者。因此,在 finally 块中执行的代码应该尽量避免抛出异常。
    • finally 块中的代码不能包含 return 语句
      • 如果 finally 块中包含 return 语句,那么 try 块和 catch 块中的 return 语句都会被忽略,程序会直接返回 finally 块中的返回值。因此,在 finally 块中执行的代码应该尽量避免包含 return 语句。
    • try-catch-finally 语句应该尽量简洁
      • try-catch-finally 语句的作用是处理异常和执行必要的清理操作,因此应该尽量简洁,避免包含过多的代码。如果需要在 try-catch-finally 语句中执行大量的代码,可以考虑将这些代码放在其他方法中,然后在 try-catch-finally 语句中调用这些方法。

            总之,try-catch-finally 语句是 Java 中常用的异常处理机制,使用时需要注意以上几点,以确保程序的正确性和稳定性。

    2、finally 块中的代码不能抛出异常

    反例代码

    1. package com.ybw.jdk8.demo.exception;
    2. import lombok.extern.slf4j.Slf4j;
    3. /**
    4. * @author weixiansheng
    5. * @version V1.0
    6. * @className FinallyException
    7. * @date 2023/11/16
    8. **/
    9. @Slf4j
    10. public class FinallyException {
    11. public static void main(String[] args) {
    12. log.info("getFinallyException start");
    13. FinallyService.getFinallyException();
    14. log.info("getFinallyException end");
    15. }
    16. }
    1. package com.ybw.jdk8.demo.exception;
    2. import lombok.extern.slf4j.Slf4j;
    3. /**
    4. * @author weixiansheng
    5. * @version V1.0
    6. * @className FinallyService
    7. * @date 2023/11/16
    8. **/
    9. @Slf4j
    10. public class FinallyService {
    11. /**
    12. * finally 块中的代码抛出异常
    13. *
    14. * @methodName: getFinallyException
    15. * @return: void
    16. * @author: weixiansheng
    17. * @date: 2023/11/16
    18. **/
    19. public static void getFinallyException() {
    20. try {
    21. log.info("try");
    22. int i = 1 / 0;
    23. log.info("i=" + i);
    24. } catch (Exception e) {
    25. log.error("error:", e);
    26. } finally {
    27. throw new RuntimeException("finally");
    28. }
    29. }
    30. }

    打印日志

    1. [INFO ] 2023-11-16 16:04:19.549 [main] c.y.j.d.exception.FinallyException - getFinallyException start
    2. [INFO ] 2023-11-16 16:04:19.552 [main] c.y.j.demo.exception.FinallyService - try
    3. [ERROR] 2023-11-16 16:04:19.554 [main] c.y.j.demo.exception.FinallyService - error:
    4. java.lang.ArithmeticException: / by zero
    5. at com.ybw.jdk8.demo.exception.FinallyService.getFinallyException(FinallyService.java:24)
    6. at com.ybw.jdk8.demo.exception.FinallyException.main(FinallyException.java:15)
    7. Exception in thread "main" java.lang.RuntimeException: finally
    8. at com.ybw.jdk8.demo.exception.FinallyService.getFinallyException(FinallyService.java:29)
    9. at com.ybw.jdk8.demo.exception.FinallyException.main(FinallyException.java:15)

    影响

    • FinallyService的异常导致FinallyException.main方法被中断。
      • 如果FinallyException.main有事务,会造成事务回滚。

    3、finally 块中的代码不能包含 return 语句

    反例代码

    catch返回结果

    1. package com.ybw.jdk8.demo.exception;
    2. import lombok.extern.slf4j.Slf4j;
    3. /**
    4. * @author weixiansheng
    5. * @version V1.0
    6. * @className FinallyReturn
    7. * @date 2023/11/16
    8. **/
    9. @Slf4j
    10. public class FinallyReturn {
    11. public static void main(String[] args) {
    12. boolean flag = FinallyService.getFinallyReturn();
    13. log.info("flag:{}", flag);
    14. }
    15. }
    1. package com.ybw.jdk8.demo.exception;
    2. import lombok.extern.slf4j.Slf4j;
    3. /**
    4. * @author weixiansheng
    5. * @version V1.0
    6. * @className FinallyService
    7. * @date 2023/11/16
    8. **/
    9. @Slf4j
    10. public class FinallyService {
    11. /**
    12. * finally 块中的代码抛出异常
    13. *
    14. * @methodName: getFinallyException
    15. * @return: void
    16. * @author: weixiansheng
    17. * @date: 2023/11/16
    18. **/
    19. public static void getFinallyException() {
    20. try {
    21. log.info("try");
    22. int i = 1 / 0;
    23. log.info("i=" + i);
    24. } catch (Exception e) {
    25. log.error("error:", e);
    26. } finally {
    27. throw new RuntimeException("finally");
    28. }
    29. }
    30. /**
    31. * @methodName: getFinallyReturn
    32. * @return: boolean
    33. * @author: weixiansheng
    34. * @date: 2023/11/16
    35. **/
    36. public static boolean getFinallyReturn() {
    37. int i = 1;
    38. try {
    39. int j = i / 0;
    40. log.info("j:{}", j);
    41. } catch (Exception e) {
    42. log.error("捕获异常:", e);
    43. return false;
    44. } finally {
    45. log.info("finally");
    46. return true;
    47. }
    48. }
    49. }

    打印日志

    1. [ERROR] 2023-11-16 16:13:13.430 [main] c.y.j.demo.exception.FinallyService - 捕获异常:
    2. java.lang.ArithmeticException: / by zero
    3. at com.ybw.jdk8.demo.exception.FinallyService.getFinallyReturn(FinallyService.java:43)
    4. at com.ybw.jdk8.demo.exception.FinallyReturn.main(FinallyReturn.java:14)
    5. [INFO ] 2023-11-16 16:13:13.432 [main] c.y.j.demo.exception.FinallyService - finally
    6. [INFO ] 2023-11-16 16:13:13.433 [main] c.y.j.demo.exception.FinallyReturn - flag:true

    结果为 finally返回的true。

    catch抛异常

    1. package com.ybw.jdk8.demo.exception;
    2. import lombok.extern.slf4j.Slf4j;
    3. /**
    4. * @author weixiansheng
    5. * @version V1.0
    6. * @className FinallyReturn
    7. * @date 2023/11/16
    8. **/
    9. @Slf4j
    10. public class FinallyReturn {
    11. public static void main(String[] args) {
    12. boolean flag = FinallyService.getFinallyReturn2();
    13. log.info("flag:{}", flag);
    14. }
    15. }
    1. package com.ybw.jdk8.demo.exception;
    2. import lombok.extern.slf4j.Slf4j;
    3. /**
    4. * @author weixiansheng
    5. * @version V1.0
    6. * @className FinallyService
    7. * @date 2023/11/16
    8. **/
    9. @Slf4j
    10. public class FinallyService {
    11. /**
    12. * finally 块中的代码抛出异常
    13. *
    14. * @methodName: getFinallyException
    15. * @return: void
    16. * @author: weixiansheng
    17. * @date: 2023/11/16
    18. **/
    19. public static void getFinallyException() {
    20. try {
    21. log.info("try");
    22. int i = 1 / 0;
    23. log.info("i=" + i);
    24. } catch (Exception e) {
    25. log.error("error:", e);
    26. } finally {
    27. throw new RuntimeException("finally");
    28. }
    29. }
    30. /**
    31. * @methodName: getFinallyReturn
    32. * @return: boolean
    33. * @author: weixiansheng
    34. * @date: 2023/11/16
    35. **/
    36. public static boolean getFinallyReturn() {
    37. int i = 1;
    38. try {
    39. int j = i / 0;
    40. log.info("j:{}", j);
    41. } catch (Exception e) {
    42. log.error("捕获异常:", e);
    43. return false;
    44. } finally {
    45. log.info("finally");
    46. return true;
    47. }
    48. }
    49. /**
    50. * @methodName: getFinallyReturn2
    51. * @return: boolean
    52. * @author: weixiansheng
    53. * @date: 2023/11/16
    54. **/
    55. public static boolean getFinallyReturn2() {
    56. int i = 1;
    57. try {
    58. int j = i / 0;
    59. log.info("j:{}", j);
    60. } catch (Exception e) {
    61. log.error("捕获异常:", e);
    62. throw new RuntimeException("catch exception");
    63. } finally {
    64. log.info("finally");
    65. return true;
    66. }
    67. }
    68. }

    打印日志

    1. [ERROR] 2023-11-16 16:20:58.470 [main] c.y.j.demo.exception.FinallyService - 捕获异常:
    2. java.lang.ArithmeticException: / by zero
    3. at com.ybw.jdk8.demo.exception.FinallyService.getFinallyReturn2(FinallyService.java:63)
    4. at com.ybw.jdk8.demo.exception.FinallyReturn.main(FinallyReturn.java:14)
    5. [INFO ] 2023-11-16 16:20:58.472 [main] c.y.j.demo.exception.FinallyService - finally
    6. [INFO ] 2023-11-16 16:20:58.472 [main] c.y.j.demo.exception.FinallyReturn - flag:true

     catch中的异常没有做处理,依然返回了true。

    影响

    • try 块和 catch 块中的 return 语句都会被忽略,程序会直接返回 finally 块中的返回值。
      • 如果想要try 块和 catch 块中的 return结果,后面执行的逻辑肯定是错误的。
    • catch 块中的 异常 语句都会被忽略,程序会直接返回 finally 块中的返回值。
      • catch中的异常会消失,不会影响调用程序。调用程序如果有事务,是无法靠catch中异常回滚事务的。
  • 相关阅读:
    生产环境 /dev/vda1文件满了导致redis无法写入问题分析 以及df -h解析
    ADAS/AD笔记之特斯拉Autopilot-HW3.0系统
    Node学习笔记之Node简介
    【Python】使用 Python 中的 aioredis 实现后进先出队列
    人工智能人工神经网络,神经元网络 人工智能
    循环结构 ----- for/in 语句 与 for/of语句
    [leetcode hot 150]第十一题,盛水最多的容器
    【NGINX--3】流量管理
    基于springboot的社区团购系统设计与实现
    易云维®医院后勤管理系统软件利用物联网智能网关帮助实现医院设备实现智能化、信息化管理
  • 原文地址:https://blog.csdn.net/xixingzhe2/article/details/134443871