JavaSE入门学习笔记---异常3(异常的处理流程)
2026/6/13 10:33:15 网站建设 项目流程

一、核心流程总览

你总结的流程完全命中核心!我们把它梳理得更清晰,搭配场景理解:

graph TD A[开始执行程序] --> B[进入try块,执行代码] B --> C{try块是否发生异常?} C -->|否| D[执行finally块(若有)] D --> E[程序正常继续运行] C -->|是| F[终止try块剩余代码,匹配catch异常类型] F --> G{找到匹配的catch块?} G -->|是| H[执行对应catch块的处理逻辑] H --> D G -->|否| I[异常向上传递给上层调用者] I --> J{上层调用者是否处理异常?} J -->|是| H J -->|否| K[继续向上传递] K --> L{传递到main方法?} L -->|否| I L -->|是| M{main方法是否处理异常?} M -->|是| H M -->|否| N[交给JVM处理,程序异常终止]

二、流程拆解

结合之前的 “除以 0” 代码示例,逐步对应流程:

示例代码回顾:

public class ExceptionDemo { public static void main(String[] args) { int a = 10; int b = 0; try { int result = a / b; // 步骤2:执行此处触发异常 System.out.println("结果:" + result); // 异常后不执行 } catch (ArithmeticException e) { System.out.println("出错了!" + e.getMessage()); // 步骤4:执行catch逻辑 } finally { System.out.println("finally执行~"); // 步骤5:必执行 } System.out.println("程序正常结束~"); // 步骤6:继续运行 } }

流程对应:

  1. 执行 try 代码:程序进入 try 块,执行a / b(触发ArithmeticException)。
  2. 终止 try 剩余代码:System.out.println("结果:" + result)不再执行。
  3. 匹配 catch 类型:异常类型是ArithmeticException,与 catch 声明的类型完全匹配。
  4. 执行 catch 逻辑:打印 “出错了!/by zero”。
  1. 执行 finally 代码:无论是否异常,都会打印 “finally 执行~”。
  1. 程序继续运行:执行 try-catch-finally 之外的代码,打印 “程序正常结束~”。

若没有匹配的 catch 块?(场景延伸)

如果把 catch 块改成NullPointerException(不匹配ArithmeticException):

catch (NullPointerException e) { System.out.println("空指针异常?"); }

流程会变成:

  1. try 块触发ArithmeticException → 2. 找不到匹配的 catch → 3. 异常向上传递(这里 main 是最上层)→ 4. main 未处理 → 5. 交给 JVM → 6. 程序崩溃(打印异常堆栈信息),finally 仍会执行!

三、关键流程细节(避坑重点)

  1. 异常传递规则
    • 未被捕获的异常,会沿着 “方法调用链” 向上传递(比如A()调用B(),B()调用C(),C()抛异常→B()→A()→main())。
    • 传递过程中,只要有一个方法用 try-catch 捕获并处理,传递就会终止。
  1. finally 的执行时机
    • 在方法返回前执行(无论 try/catch 里有没有return)。
    • 例外情况:System.exit(0)(强制退出 JVM)会跳过 finally。
  1. JVM 的 “兜底处理”
    • 当异常传递到 main 方法仍未处理时,JVM 会打印「异常堆栈信息」(包含异常类型、原因、发生位置),然后终止程序。
    • 堆栈信息是调试的关键!比如:
Exception in thread "main" java.lang.ArithmeticException: / by zero at ExceptionDemo.main(ExceptionDemo.java:6) // 明确指出异常发生在第6行

四、流程记忆口诀(快速回顾)

try 执行遇异常,

catch 匹配就处理,

不匹配就向上递,

finally 始终执行,

main 仍不处理时,

JVM 接手程序停!

五、实战意义

理解完整流程后,能更精准地:

  • 定位异常传递路径(比如知道异常从哪个方法抛出来,该在哪层处理)。
  • 设计异常处理策略(比如在 Service 层抛异常,Controller 层统一捕获)。
  • 调试异常(通过堆栈信息快速找到异常发生的代码行)。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询