IntelliJ IDEA 18.1调试时评估含方法引用表达式的Bug反馈
关于调试时方法引用表达式无法评估的问题
我来帮你捋清楚这个问题——你的代码正常运行完全没问题,但调试模式下评估带方法引用的流表达式时遇到报错,这其实是Java调试工具(像IDEA、Eclipse这类IDE的调试器)的常见功能限制。
先看你的代码:
import java.util.List; public class Main { public static void main(String[] args) { var first = List.of("a", "b", "c").stream().map(String::length).findFirst(); System.out.print(first); } }
正常运行时JVM能完美解析String::length这个方法引用,但调试器在即时评估表达式的时候,对方法引用这类语法糖的支持并不完善。这是因为调试器的表达式求值引擎没办法像JVM运行时那样,完整地解析和执行方法引用的语法逻辑。
解决办法
有几个简单的方式可以绕过这个限制:
- 替换方法引用为Lambda表达式:把
String::length改成s -> s.length(),调试器就能正常评估这个表达式了,修改后的表达式如下:List.of("a", "b", "c").stream().map(s -> s.length()).findFirst(); - 分步调试拆分表达式:不要直接评估整个链式流表达式,拆分步骤查看。比如先评估
List.of("a", "b", "c").stream()确认流对象正常,再逐步添加map和findFirst操作,同样能达到调试查看结果的目的。 - 提前赋值到临时变量:在代码里把中间结果拆成变量存储,比如:
调试时直接查看每个变量的值,就不用再评估复杂的链式表达式了。var list = List.of("a", "b", "c"); var stream = list.stream(); var mappedStream = stream.map(String::length); var first = mappedStream.findFirst();
本质上这不是你的代码有错误,而是调试工具的功能局限——方法引用是Java 8引入的语法糖,调试器的表达式求值引擎对这类语法的支持,滞后于JVM本身的执行能力。
内容的提问来源于stack exchange,提问作者Everton Pereira
相关产品推荐
相关产品推荐

