若try块无异常,则完整执行try内语句,跳过所有catch,有finally时必执行其内容后再继续后续代码;finally具兜底性,即使try含return也先暂存再执行finally,若finally含return则覆盖前者;无匹配catch时异常向上抛出,finally仍执行。

如果 try 块中没抛出异常,程序会完整执行 try 内所有语句,然后直接跳过所有 catch 块,继续执行 catch 块之后的第一条语句。
try 正常执行时的流向
这是最基础也最容易忽略的路径。只要 try 里每行代码都顺利运行,不触发任何异常,整个 try 就像普通代码块一样走完。此时:
- 所有 catch 块完全被绕过,内部语句一句都不会执行
- 若存在 finally 块,它会在 try 执行完后、catch 跳过之后立即执行
- finally 执行完毕,就接着运行 try-catch-finally 结构外的下一行代码
有 finally 时的执行保障
finally 的核心作用是“兜底”,和异常是否发生无关。哪怕 try 一路绿灯,finally 也必走一遍:
- 用于释放资源(如关闭文件流、断开数据库连接)
- 即使 try 中有 return,也会先暂存返回值,再进 finally,最后才真正返回
- 注意:如果 finally 里也有 return,它会覆盖 try 或 catch 中已确定的返回值
没有匹配 catch 时的异常传递
当 try 抛出异常,但没有任何 catch 块能捕获它(比如类型不匹配或干脆没写 catch),流程是:
立即学习“Java免费学习笔记(深入)”;
- try 中异常点之后的代码不再执行
- 所有 catch 块都不进入
- 若存在 finally,仍会执行一次
- 然后异常向上一层调用栈抛出,由上层方法处理,或最终交由 JVM 终止程序
常见误区提醒
几个高频混淆点需要特别注意:
- “catch 后的第一条语句” ≠ “catch 块里的第一条语句”——前者在结构外部,后者在异常处理内部
- try 中某行出错,该行之后的 try 内容全部跳过,不是只跳过那一行
- System.exit()、JVM 强制终止等极端情况会让 finally 都不执行,但这不属于正常控制流

















