一、核心流程总览你总结的流程完全命中核心我们把它梳理得更清晰搭配场景理解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继续运行 } }流程对应执行 try 代码程序进入 try 块执行a / b触发ArithmeticException。终止 try 剩余代码System.out.println(结果 result)不再执行。匹配 catch 类型异常类型是ArithmeticException与 catch 声明的类型完全匹配。执行 catch 逻辑打印 “出错了/by zero”。执行 finally 代码无论是否异常都会打印 “finally 执行”。程序继续运行执行 try-catch-finally 之外的代码打印 “程序正常结束”。若没有匹配的 catch 块场景延伸如果把 catch 块改成NullPointerException不匹配ArithmeticExceptioncatch (NullPointerException e) { System.out.println(空指针异常); }流程会变成try 块触发ArithmeticException → 2. 找不到匹配的 catch → 3. 异常向上传递这里 main 是最上层→ 4. main 未处理 → 5. 交给 JVM → 6. 程序崩溃打印异常堆栈信息finally 仍会执行三、关键流程细节避坑重点异常传递规则未被捕获的异常会沿着 “方法调用链” 向上传递比如A()调用B()B()调用C()C()抛异常→B()→A()→main()。传递过程中只要有一个方法用 try-catch 捕获并处理传递就会终止。finally 的执行时机在方法返回前执行无论 try/catch 里有没有return。例外情况System.exit(0)强制退出 JVM会跳过 finally。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 层统一捕获。调试异常通过堆栈信息快速找到异常发生的代码行。
JavaSE入门学习笔记---异常3(异常的处理流程)
发布时间:2026/6/13 10:33:19
一、核心流程总览你总结的流程完全命中核心我们把它梳理得更清晰搭配场景理解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继续运行 } }流程对应执行 try 代码程序进入 try 块执行a / b触发ArithmeticException。终止 try 剩余代码System.out.println(结果 result)不再执行。匹配 catch 类型异常类型是ArithmeticException与 catch 声明的类型完全匹配。执行 catch 逻辑打印 “出错了/by zero”。执行 finally 代码无论是否异常都会打印 “finally 执行”。程序继续运行执行 try-catch-finally 之外的代码打印 “程序正常结束”。若没有匹配的 catch 块场景延伸如果把 catch 块改成NullPointerException不匹配ArithmeticExceptioncatch (NullPointerException e) { System.out.println(空指针异常); }流程会变成try 块触发ArithmeticException → 2. 找不到匹配的 catch → 3. 异常向上传递这里 main 是最上层→ 4. main 未处理 → 5. 交给 JVM → 6. 程序崩溃打印异常堆栈信息finally 仍会执行三、关键流程细节避坑重点异常传递规则未被捕获的异常会沿着 “方法调用链” 向上传递比如A()调用B()B()调用C()C()抛异常→B()→A()→main()。传递过程中只要有一个方法用 try-catch 捕获并处理传递就会终止。finally 的执行时机在方法返回前执行无论 try/catch 里有没有return。例外情况System.exit(0)强制退出 JVM会跳过 finally。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 层统一捕获。调试异常通过堆栈信息快速找到异常发生的代码行。