【问题标题】:Interpret Java stack trace with lambdas such as ".lambda$null$2" & and "$$Lambda$"使用“.lambda$null$2”& 和“$$Lambda$”等 lambda 解释 Java 堆栈跟踪
【发布时间】:2015-10-19 09:42:18
【问题描述】:

我正在寻找 Java 8 堆栈跟踪中出现在 lambda 周围的部分的定义

例如这段代码

Object inputData = someData();

myList.stream().forEach(listItem -> {

    Query query = (Query) listItem.getSingle().apply(this.getId());

    Object data = diffUtils.applyProjection(query, inputData);

    myStringCollection.stream()
       .filter(destination -> myPredicateMethod(listItem, destination))
       .forEach(destination -> myProcessMethod(destination, data));
}

有时会产生此异常。

at [CLASS].lambda$null$2([CLASS].java:85)
at [CLASS]$$Lambda$64/730559617.accept(Unknown Source)

异常中描述的不同部分是什么? “null”、“2”、“64”、“730559617”和“Unknown Source”告诉我什么?

可以在此处找到更详细的示例(但此处我的异常中的“null”不存在)。 http://blog.takipi.com/the-dark-side-of-lambda-expressions-in-java-8/

【问题讨论】:

标签: java exception logging lambda stack-trace


【解决方案1】:

这个生成的类名没有标准定义。这样做是为了避免您编写依赖于它的代码,这会使设计人员以后更难更改它。

话虽这么说,你能读懂的东西很少;

  • 类名的第一部分是调用站点的类。
  • 最后一个$ 之前的数字是 lambda 的全局计数器。这取决于生成 lambda 代码的顺序。
  • 大数字是生成的ID。同一个 lambda 每次运行时都会有所不同,但一旦开始就不会改变。

“未知来源”告诉您此生成的代码没有与之关联的调试信息。

我们正在研究一个用于更改 lambda 的 toString 的库,以便让您了解与之相关的代码。即,至少对于琐碎的情况,它看起来像 lambda 的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2014-10-07
    • 1970-01-01
    相关资源
    最近更新 更多