【问题标题】:why dose debug break point not hitting on my lamda function (java8 use idea)?为什么剂量调试断点没有命中我的 lambda 函数(java 8 使用想法)?
【发布时间】:2020-06-01 09:03:35
【问题描述】:

版本:IDEA 2019.3 JDK8

尝试过的方法:

  1. 我正在尝试用花括号括起来

  2. 全局只命中一个断点,均未生效

程序直接进入保存方法,

    public <V0 extends Rmap> Output<V0> prior(Trans<V0, Rmap> conv) {
        return saving(ds0 -> {
            enqueue((DSdream) ds0.map((Function<Rmap, Rmap>) row -> {
                Rmap r = conv.apply((V0) row);
                return Rec.of(r, tds.get(r.table().toString()));
            }, f));
        });
    }

如何在 lambda 断点处停止?

谢谢

【问题讨论】:

  • 请内联发布代码,永远不要发布您的 IDE 的屏幕截图。
  • 你确定断点行的代码确实被执行了吗?当您启动调试会话时 - 检查断点是否具有 verified 状态。尝试构建 |在启动调试之前重建操作。检查断点设置 - 即启用了 suspend property

标签: intellij-idea lambda java-8


【解决方案1】:

我尝试使用通常会在断点处停止的匿名内部类,

    @Override
    public <V0 extends Rmap> Output<V0> prior(Trans<V0, Rmap> conv) {
        Output<Rmap> saving = saving(new Consumer<DSdream>() {
            @Override
            public void accept(DSdream dSdream) {
                enqueue((DSdream)
                        dSdream.map((Function<Rmap, Rmap>) row -> {
                            Rmap r = conv.apply((V0) row);
                            return Rec.of(r, tds.get(r.table().toString()));
                        }, f));
            }
        });
        return (Output<V0>) saving;
    }

想必,反编译后,lambda被编译成内部类, 所以断点无法定位。 应该是lambda的缺点

【讨论】:

  • 没有反编译发生。此外,lambda 表达式被编译为其包含类的方法。 lambda 表达式中的断点没有问题。您的问题是合乎逻辑的;由于在调用saving 方法之前没有调用accept 方法,因此在调用之前也不能命中@​​987654324@ 方法中的断点。匿名内部类不会改变这一点。
  • 我有点迷惑,lambda不是顺序执行?
  • 由于我不知道你的saving方法是做什么的,所以我不能说它是否会顺序执行消费者的代码。该方法甚至可能根本不调用它。可以肯定的是,您的 prior 不会调用 accept 方法(或者您是否在代码中看到了 accept 调用?)。您正在创建对象并将其传递给saving 方法,并且saving 方法可能会调用其上的方法。因此,当然,在进入saving 方法之前不会遇到断点。
  • 我明白你的意思。代码太大复制不出来,我把问题抽象成小demo吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多