调试流畅风格的代码时,如何找到哪个链接方法失败?

When debugging fluent style code, how to find which chained method fails?

在正常的编程风格中,逻辑被组织成语句,每条占一行。例如

statement A;
statement B;
statement C;
...

当出现错误时,编译器会告诉我失败语句的行号。我可以使用这个缩小的范围轻松调试。

但是,现在使用了流式代码(例如在 Java Stream API 中),长逻辑块以链式方法的形式写在一条语句中。例如:

 methodA()
  .methodB()
  .methodC()
  .methodD()
  ....

当失败发生时,什么是缩小链接方法失败的好方法?我担心的是编译器的调试提示只有一个行号,但是整个链接块都包含在这一行语句中,这对调试帮助不大。

在不同的行上对链接的方法进行编码。

当链式方法在不同的行上编码时,堆栈跟踪包含失败的方法调用的行号。

例如:

public class MyClass {

    MyClass okMethod() {
        return this;
    }

    MyClass explodingMethod() {
        throw new RuntimeException();  // line 10
    }

    public static void main(String[] args) {
        new MyClass()
                .okMethod()
                .explodingMethod() // line 16
                .okMethod();
    }
}

执行此操作会导致此堆栈跟踪出现异常:

Exception in thread "main" java.lang.RuntimeException
    at MyClass.explodingMethod(MyClass.java:10)
    at MyClass.main(MyClass.java:16) // this is the call that exploded

请注意,堆栈跟踪中的行号显示了哪个实际方法调用爆炸了。