finally中的return优先级最高,直接终止方法并返回;try/catch中的return被暂存,需等finally执行完才返回(若finally无return);finally中抛异常会覆盖原有返回值或异常。

Java里try-catch-finally中return的优先级很明确:finally里的return拥有最高优先级,一旦出现,就直接生效并终止方法;而try或catch中的return只是“暂存”,必须等finally执行完才能真正返回——前提是finally没写return。
try或catch中有return、finally中没有
此时return值会在跳入finally前被计算并暂存(比如基本类型值被拷贝一份,引用类型则保存对象地址)。finally执行完毕后,方法返回那个暂存值。
- int i = 1; try { return i; } finally { i = 100; } → 返回1(基本类型不受影响)
- List<String> list = new ArrayList<>(); try { list.add("a"); return list; } finally { list.add("b"); } → 返回的list内容是["a", "b"](引用类型对象本身被修改)
finally中也有return
这是高风险操作。只要finally里写了return,无论try是否执行、catch是否捕获异常、原return值是什么,最终都只返回finally里的值,且方法立即退出。
- try { return 1; } catch(Exception e) { return 2; } finally { return 3; } → 总是返回3
- 编译器通常会警告该写法,因为会静默掩盖异常和业务逻辑意图,调试困难
- 资源清理场景下应避免return,只做close()、shutdown()等无副作用操作
finally中抛出异常
如果finally执行过程中throw了新异常,它会完全取代try/catch中已有的返回值或异常,成为方法最终抛出的内容。
立即学习“Java免费学习笔记(深入)”;
- try { return "ok"; } catch(Exception e) { return "err"; } finally { throw new RuntimeException("cleanup failed"); } → 方法不返回任何值,而是抛出RuntimeException
- 原始业务异常或返回值被丢弃,导致问题定位失真,应尽量避免在finally中抛异常
没有return时的默认流程
如果try和catch都没return,程序会继续执行到方法末尾;此时finally仍会执行,但不影响返回逻辑——最终返回的是方法末尾的return语句或默认值(如void方法无返回)。
- 即使try中发生异常、catch未处理(或没写catch),finally也照常执行,之后异常向上抛出
- 只有System.exit()、JVM崩溃或线程中断等极端情况,finally才可能不执行


















