IntelliJ IDEA 2020.3社区版调试Java Stream报Internal error
问题现象
调试Java Stream代码时,开启Debug模式后点击Debug工具窗口中的Trace Current Stream Chain按钮,Stream trace窗口可正常打开,但窗口内不展示流的各阶段计算评估结果,仅提示Internal error。
当前使用IDE版本为IDEA Community Edition 2020.3,复现问题的测试代码如下:
public class Main { public static void main(String... args) throws IOException { String input = "Speedment"; String result = Stream.of(input.split("")) .map(s -> s.charAt(0)) .sorted() .limit(5) .map(String::valueOf) .collect(joining()); System.out.println(result); } }
问题原因
IDEA Community Edition 2020.3的Stream Trace功能存在内置解析缺陷:当流链路同时包含sorted()这类有状态中间操作,以及存在重载方法的方法引用(比如示例中的String::valueOf)时,解析器无法正确识别方法引用实际匹配的调用签名,触发内部错误,最终无法渲染流全链路的计算结果。
解决方法
- 直接升级IDEA社区版到2021.1及以上版本。该版本分支已经修复了上述解析bug,升级后不需要修改原有代码,就能正常查看流每个阶段的输入输出和计算结果。
- 如果暂时不能升级IDE,可以把流中触发解析问题的方法引用改成显式lambda表达式,绕开解析器的签名识别bug,对应代码修改如下:
String result = Stream.of(input.split("")) .map(s -> s.charAt(0)) .sorted() .limit(5) .map(c -> String.valueOf(c)) // 替换原有的.map(String::valueOf)写法 .collect(joining());
- 临时调试时可以先注释掉
sorted()这类有状态操作分步验证转换逻辑,但这种方式无法查看完整流链路的执行轨迹,只适合临时排查单步逻辑问题。
内容的提问来源于stack exchange,提问作者Kristina
相关产品推荐
相关产品推荐

