java 11+ 中不存在 @standardexception 注解,lombok 官方从未提供;正确做法是继承 runtimeexception/exception 并用 @allargsconstructor、@noargsconstructor、@equalsandhashcode 简化构造器和基础方法。

Java 11+ 中并没有内置的 @StandardException 注解,Lombok 官方库也从未提供过该注解。这是一个常见误解,可能源于对 Lombok 注解(如 @Data、@Builder)的类比,或某些自定义模板/第三方扩展的误传。
为什么找不到 @StandardException?
Lombok 的设计原则是“只生成编译期代码,不改变语义”,它支持的异常相关注解仅有:
-
@SneakyThrows:用于方法上,隐式抛出受检异常(绕过编译检查) -
@UtilityClass或手动配合public class MyException extends RuntimeException—— 这才是标准做法
官方未实现 @StandardException,因为异常类的构造逻辑(如是否带 cause、是否需 message format、是否要序列化字段)高度业务相关,难以统一抽象。
Java 11+ 推荐的快速自定义异常写法
用 Lombok 辅助,但不依赖不存在的注解。核心思路:继承 RuntimeException 或 Exception,用 @AllArgsConstructor + @NoArgsConstructor + @EqualsAndHashCode 快速补全基础结构:
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
public class OrderNotFoundException extends RuntimeException {
public OrderNotFoundException(String message) {
super(message);
}
public OrderNotFoundException(String message, Throwable cause) {
super(message, cause);
}
}
这样既保持语义清晰,又避免手写冗余构造器。Lombok 自动生成无参、全参构造器,以及父类字段参与的 equals/hashCode。
进阶:统一异常基类 + Lombok 简化
若项目中大量自定义异常,可定义一个泛型基类,再用 Lombok 减少重复:
public abstract class BusinessException extends RuntimeException {
private final String code;
protected BusinessException(String code, String message) {
super(message);
this.code = code;
}
protected BusinessException(String code, String message, Throwable cause) {
super(message, cause);
this.code = code;
}
public String getCode() { return code; }
}
子类只需:
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
public class PaymentTimeoutException extends BusinessException {
public PaymentTimeoutException() {
super("PAY_TIMEOUT", "支付超时,请重试");
}
}
无需再写构造器和 getter,Lombok 自动处理继承链中的字段逻辑。
注意 Java 11+ 的兼容性细节
Lombok 1.18.20+ 完全支持 Java 11–21,但需确保:
- IDE(IntelliJ/Eclipse)已安装对应版本 Lombok 插件并启用 annotation processing
- Maven/Gradle 中 Lombok 依赖 scope 为
provided或annotationProcessor - 避免在异常类中使用 record(Java 14+),因 record 不允许继承,无法作为异常基类
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











