Java含lambda字段的类构造器使用return时报变量key未初始化错误
问题原因
这是Oracle JDK 8 早期版本(你使用的8u181属于受影响范围)的已知编译器bug,并非代码逻辑错误。
JDK 8的编译校验逻辑存在缺陷:当类的实例字段用lambda表达式初始化,且构造器中存在显式return语句时,编译器会错误地将lambda的形参识别为需要在构造器中初始化的类成员变量,因此抛出不符合实际的variable key might not have been initialized报错。
验证方案
你可以将JDK版本升级到8u202及以上,或者JDK 11、17等长期支持版本,相同代码即可正常编译,该bug已在后续JDK更新中被修复。
临时规避方案
如果当前环境暂时无法升级JDK,可以选择以下任意一种方式规避该问题:
- 将lambda字段的初始化逻辑挪到构造器内部执行:
import java.util.function.Consumer; public class Test { Consumer<Integer> lambda; public Test() { lambda = key -> {}; return; } }
- 将lambda表达式替换为匿名内部类实现:
import java.util.function.Consumer; public class Test { Consumer<Integer> lambda = new Consumer<Integer>() { @Override public void accept(Integer key) { } }; public Test() { return; } }
- 去掉构造器中不必要的显式空
return语句。
内容的提问来源于stack exchange,提问作者正逍遥0716
相关产品推荐
相关产品推荐

