使用Lombok @SuperBuilder创建可抛异常默认构造方法遇阻求助
问题分析与解决方案
这确实是Lombok 1.18.32版本的功能限制——@SuperBuilder无法自动适配抛出checked异常的手动构造器,目前也没有官方配置项能直接解决这个问题。
报错原因
当你给手动定义的构造器添加throws Exception(checked异常)声明后,Lombok生成的builder代码(尤其是toBuilder()相关逻辑)会直接调用这个构造器,但生成的代码里并没有处理该checked异常的逻辑(既没有添加throws声明,也没有try-catch包裹),因此编译器会抛出"unreported exception Exception"的错误。
可行替代方案
改用Unchecked Exception
把构造器的异常声明改为抛出RuntimeException或其子类(比如自定义业务异常),这样不需要在调用处显式处理,Lombok生成的代码也能正常编译。示例:@SuperBuilder(toBuilder = true) private class SomeBuilderBase { private final String someString; protected SomeBuilderBase(SomeBuilderBaseBuilder<?,?> b) throws IllegalArgumentException { someString = b.someString; if (someString == null || someString.isBlank()) { throw new IllegalArgumentException("someString不能为空"); } } }手动维护Builder代码(优化版)
如果你必须使用checked异常,只能继续手动编写相关builder逻辑,但可以通过以下方式降低维护成本:- 用
@Generated注解标记手动生成的builder类,避免IDE的冗余提示; - 将构造器中的校验逻辑抽成独立方法,减少重复代码;
- 每次修改类成员后,对比Lombok自动生成的代码差异,同步更新手动代码。
- 用
关于版本升级
目前Lombok官方尚未针对@SuperBuilder添加支持构造器抛出checked异常的功能,升级到最新稳定版(如1.18.36)也无法解决该问题,只能持续关注官方issue的更新。
内容的提问来源于stack exchange,提问作者Andreas Forslöw
相关产品推荐
相关产品推荐

