return 关键字在 Java 中唯一作用是立即终止当前方法执行并交还控制权,可选返回值;void 方法中 return 后不可跟表达式,非 void 方法每条路径都必须有匹配类型的 return 语句,且 finally 中的 return 会覆盖 try 中的返回值。

return 关键字在 Java 中唯一作用是:立即终止当前方法执行,并把控制权交还给调用方,同时可选地返回一个值。
return 后面不写值,只用于 void 方法
void 方法表示“不返回任何结果”,所以 return 后不能跟表达式。它常用来提前退出逻辑分支:
public void logUserAction(String action) {
if (action == null) {
System.err.println("action is null");
return; // 提前结束,后面代码不执行
}
System.out.println("User did: " + action);
}
- 没有
return语句时,void 方法也会在末尾自动返回 - 但多个出口(比如 if/else 或异常处理后)中,显式
return能避免后续误执行 - 别写
return null;或return 0;—— 编译直接报错:incompatible types: unexpected return value
return 后必须带值,且类型要匹配方法声明
只要方法签名里声明了非 void 返回类型(如 int、String、List),每个执行路径都必须有且仅有一个 return 表达式,且其计算结果类型能被编译器接受为兼容类型:
public String getDisplayName(User u) {
if (u == null) {
return "Anonymous"; // OK
}
if (u.getNick() != null) {
return u.getNick(); // OK
}
return u.getName(); // 必须有这一行,否则编译失败:missing return statement
}
- 即使你“知道”某个分支不会走到,编译器也不信——比如
if (false) { return "x"; }后面仍需补return - 自动装箱/拆箱允许一定范围的宽松,例如
return 42;在Integer方法里合法,但return 128;可能因缓存机制导致 == 比较出问题,这不是return的错,而是后续使用要注意的点 - 泛型擦除后,返回值类型检查发生在编译期,运行时不会校验;所以
return new ArrayList()在ArrayList方法里会警告(unchecked conversion)
return 不会触发 finally 块跳过,但会覆盖其后的 return
很多人以为 return 一执行就立刻跳出,其实它会等 try-finally 结构里的 finally 执行完才真正返回:
立即学习“Java免费学习笔记(深入)”;
public static String getValue() {
try {
return "from try";
} finally {
System.out.println("finally runs");
// 这里如果再写 return,就会覆盖上面那个!
}
}
- 上面例子输出
finally runs,然后返回"from try" - 但如果
finally里也有return "from finally";,那最终返回的是后者,且try中的return被静默丢弃——这是极隐蔽的 bug 来源 - 同理,
finally中抛异常也会中断原return,调用方拿到的是异常而非返回值
最易被忽略的是:return 的值在进入 finally 前就已经确定并暂存,哪怕 finally 修改了相关变量,也不会影响已决定的返回值;但若返回的是对象引用,而 finally 里改了该对象内部状态,那调用方看到的就是被改过的对象——这个细节不是语法规定,而是 JVM 执行模型决定的。









