Java业务校验失败应抛出自定义RuntimeException子类异常,如BusinessException含code和message,Service层在参数、状态、唯一性校验不通过时直接throw抛出。

在 Java 中,业务逻辑校验失败时抛出自定义异常,核心是:定义一个继承自 RuntimeException(或其子类)的异常类,校验不通过时用 throw new YourCustomException(...) 主动抛出。
1. 定义自定义异常类
推荐继承 RuntimeException,避免强制 try-catch,符合业务异常“非检查型”的语义:
public class BusinessException extends RuntimeException {
private final int code; // 业务错误码,便于前端识别
public BusinessException(String message) {
super(message);
this.code = 500;
}
public BusinessException(int code, String message) {
super(message);
this.code = code;
}
public int getCode() {
return code;
}
}
也可添加构造器支持传递 Throwable cause,方便链路追踪。
2. 在 Service 层做校验并抛出
校验逻辑应放在业务方法内部,失败即抛出,不包装、不静默:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
- 检查参数合法性(如 ID 为空、金额为负)
- 检查业务状态(如订单已取消、库存不足)
- 检查唯一性约束(如用户名已存在)
示例:
public void createOrder(OrderRequest request) {
if (request == null) {
throw new BusinessException("订单请求不能为空");
}
if (request.getAmount() <= 0) {
throw new BusinessException(400, "订单金额必须大于零");
}
if (!userRepository.existsById(request.getUserId())) {
throw new BusinessException(404, "用户不存在");
}
// ... 执行创建逻辑
}
3. 全局异常处理器统一响应(可选但推荐)
用 @ControllerAdvice 捕获自定义异常,返回结构化 JSON:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ResponseEntity<ApiResponse> handleBusinessException(BusinessException e) {
return ResponseEntity.status(200).body(
ApiResponse.error(e.getCode(), e.getMessage())
);
}
}
这样前端始终收到 { "code": 400, "msg": "订单金额必须大于零" } 这类格式,前后端契约清晰。
4. 注意事项
- 不要用
Exception或IOException等系统异常伪装业务错误 - 避免在 catch 块里吞掉异常后又抛新异常却不保留 cause,丢失堆栈
- 错误码建议按模块划分(如 1001-1999 表示用户模块),便于排查
- 敏感信息(如数据库字段名、内部路径)不要直接暴露给前端

















