使用 IntelliJ IDEA 在 Groovy 中调试迭代(闭包)

问题描述 投票:0回答:2

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

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

当我在 IntelliJ IDEA (v.11) 中通过一次单步执行一行来调试此问题时,在

strings.each()
(即
println string
)中执行的代码将被跳过。我可以在
println
行放置一个断点,这样我就能够对其进行调试,但这是一个最好避免的解决方法。

有没有办法配置intelliJ不跳过Groovy闭包?文件->设置->调试器->Groovy中没有适用的选项。

编辑:

澄清我期望 intelliJ 做什么:

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

for (String string : strings) {
    println string
}

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

对于需要手动设置断点的一两个闭包的情况,这可能不是问题。但如果有很多,“自动”进入它们就真的很巧妙了。

debugging groovy intellij-idea closures iteration
2个回答
6
投票

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

就像您发现的那样,您可以在

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

我发现有时有用的另一条路线是获取这些闭包中的所有内容并将其放入闭包调用的方法中,而不是直接将代码放在闭包中。这不会对运行时行为产生太大影响,而且我发现它使我能够更好地控制事物。它通常也表明我也需要重构,因为深入研究该代码已经太痛苦了。


0
投票

我不明白它是如何工作的,但禁用该设置对我有帮助

文件->设置->调试器->Groovy->“不要单步执行特定的 Groovy 类”

© www.soinside.com 2019 - 2024. All rights reserved.