我有一个混合 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”,调试器会毫无问题地进入迭代。我可以继续“跳过”并且仍然处于循环中,直到没有更多的对象可以迭代为止。这就是我对上述关闭的期望。
在您必须手动设置断点的一两个闭包的情况下,这可能不是问题。但是如果有很多,“自动”进入它们会非常巧妙。
最佳答案
我完全同意 IntelliJ 中需要更好的 Closure 调试支持,因为您要求做的事情并不总是像不跳过一些障碍一样简单。
就像您发现的那样,您可以在 println
上放置一个断点行,这通常会让您在 Closure 内中断(但并非总是如此)。一旦有了断点,IntelliJ 就会有一个非常强大的条件断点系统,它可以让您更好地控制何时中断。
我不时发现的另一种有用的方法是将这些闭包中的所有内容都放入闭包调用的方法中,而不是直接将代码放在闭包中。这不会过多地改变运行时行为,而且我发现它让我对事情有了更多的控制。这通常也表明我也需要重构,因为深入研究代码已经太痛苦了。
关于使用 IntelliJ IDEA 在 Groovy 中调试迭代(闭包),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15334766/