8

我有一个混合了 Java 和 Groovy 代码的代码库。对于 Groovy 代码中的迭代,我们倾向于使用闭包:

String[] strings = ["First", "Second", "Third"]
strings.each { string ->
    println string
}

当我在 IntelliJ IDEA (v. 11) 中通过一次步进一行来调试它时,在strings.each()(即println string) 中执行的代码被跳过。我可以在该行放置一个断点println,并且可以对其进行调试,但这是一个可以避免的小变通方法。

有没有办法配置 intelliJ 不跳过 Groovy 闭包?File->Settings->Debugger->Groovy中没有适用的选项。

编辑:

为了澄清我期望 intelliJ 做什么:

假设我有这样的 Java 风格迭代:

for (String string : strings) {
    println string
}

如果我使用“Step over”,调试器会毫无问题地进入迭代。我可以继续“越过”并且仍然处于循环中,直到没有更多对象可以迭代。这就是我对上述关闭的期望。

在您必须手动设置断点的一两个闭包的情况下,这可能不是问题。但是如果有很多,“自动”进入它们会非常巧妙。

4

1 回答 1

6

我完全同意 IntelliJ 中需要更好的 Closure 调试支持,因为您要求做的事情并不总是像它应该做的那样简单而无需跳过一些障碍。

就像您发现的那样,您可以println在行上放置一个断点,这通常会让您在闭包内中断(但并非总是如此)。一旦你有了断点,IntelliJ 就有一个非常强大的条件断点系统,它可以让你更好地控制何时断点。

我不时发现有用的另一条路线是将这些闭包中的所有内容放入闭包调用的方法中,而不是将代码直接放在闭包中。这不会过多地改变运行时行为,而且我发现它让我对事物有更多的控制权。这通常也表明我也需要重构,因为深入研究该代码已经太痛苦了。

于 2013-03-12T14:07:52.247 回答