return 用於方法返回,兩大基本用法:
方法聲明了非 void 返回類型,所有執行路徑必須以 return 值; 結束。
public int add(int a, int b) {
return a + b; // 返回計算結果
}
public User findById(Long id) {
if (id == null) return null; // 提前返回
User user = userDao.selectById(id);
return user; // 正常返回
}
public List<String> getNames() {
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
return list; // 返回集合引用
}
注意:返回引用類型時,返回的是對象引用副本,調用者可修改對象內部狀態,但無法改變方法內局部變量的引用指向。
void 方法中使用 return;(無表達式)提前結束執行,常見於守衛條件、異常情況退出。
public void processOrder(Order order) {
if (order == null) {
log.warn("訂單為空");
return; // 直接結束,不執行後續邏輯
}
if (order.getStatus() != OrderStatus.PENDING) {
log.info("訂單狀態非待處理: " + order.getStatus());
return;
}
// 核心業務邏輯
paymentService.pay(order);
inventoryService.deduct(order);
notificationService.notify(order);
}
public void saveWithValidation(User user) {
if (!validator.isValid(user)) {
throw new IllegalArgumentException("數據校驗失敗");
// return; // 如果不拋異常,用 return 結束
}
userDao.insert(user);
}
public int tricky() {
try {
return 1;
} finally {
return 2; // 覆蓋 try 的返回值!最終返回 2
}
}
規則:finally 塊若包含 return/throw,將覆蓋 try/catch 的返回/異常。嚴禁在 finally 中使用 return。
// 單行表達式:隱式返回
Function<Integer, Integer> square = x -> x * x;
// 代碼塊:必須顯式 return
Function<Integer, Integer> cube = x -> {
int result = x * x * x;
return result;
};
// forEach 中 return 相當於 continue
list.forEach(item -> {
if (item.skip()) return; // 跳過本次迭代
process(item);
});
構造器不能使用 return 值;,但可用 return; 提前結束初始化:
public User(String name) {
if (name == null) {
this.name = "匿名";
return; // 合法:結束構造器執行
}
this.name = name;
}
public Data fetchData() {
try {
return remoteClient.call(); // 正常返回
} catch (TimeoutException e) {
log.warn("超時,返回降級數據");
return fallbackData(); // 異常分支返回
} catch (Exception e) {
log.error("調用失敗", e);
throw new ServiceException("數據獲取失敗", e); // 拋異常而非返回
}
}
return,減少分支認知負荷。return 或拋異常,避免深層巢狀 if。return Optional.ofNullable(user); 強制調用者處理空值。return 既是數據流的出口,也是控制流的跳轉。掌握「返回值」與「提前結束」兩大用法,警惕 finally 覆蓋陷阱,善用守衛條款簡化邏輯,編寫清晰、健壯的方法。