调试流畅风格的代码时,如何找到哪个链接方法失败?
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
请注意,堆栈跟踪中的行号显示了哪个实际方法调用爆炸了。
在正常的编程风格中,逻辑被组织成语句,每条占一行。例如
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
请注意,堆栈跟踪中的行号显示了哪个实际方法调用爆炸了。