【发布时间】:2013-02-26 09:41:54
【问题描述】:
我有一个混合了 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 中没有适用的选项。 p>
编辑:
澄清我期望 intelliJ 做什么:
假设我有一个这样的 Java 风格迭代:
for (String string : strings) {
println string
}
如果我使用“Step over”,调试器会毫无问题地进入迭代。我可以继续“越过”并且仍然处于循环中,直到没有更多对象可以迭代。这就是我对上述闭包的期望。
在您必须手动设置断点的一两个闭包的情况下,这可能不是问题。但是如果有很多,“自动”进入它们会很巧妙。
【问题讨论】:
-
你在做“步入”吗? (F7快捷键)
-
@Nebelmann 如果我“进入”,我必须通过一整套 Groovy 类来设置迭代。我终于进入了循环,但到达那里仍然很麻烦。
-
恐怕你无能为力,那么......据我所知,
each是一个闭包,所以如果你跨过它将跳过整个函数,如果你介入你将不得不处理很多“噪音”,比如在 Java 中,当你想进入 Spring bean 方法调用并最终进入代理时......在闭包的第一行设置断点是我唯一的解决方案我知道。 编辑:我刚刚发现了 IntelliJ 的Debugger > Stepping选项,它可以防止你在 groovy 的内部结构上苦苦挣扎……值得一试 :) -
真可惜。由于 intelliJ 与 Groovy 配合得非常好,我希望默认行为是进入闭包。但我明白你的意思,谢谢。
-
Nebelmann 是正确的,Step Over 会跳过一个方法调用(每个方法调用或任何其他关闭方法)并且不会进入内部。如果您有设置 |调试器 |时髦的 |不要单步执行特定的 Groovy 方法,那么 Step Into 可能会将您直接转到闭包,也可能不会,具体取决于您的 Groovy 版本。 Groovy 运行时不适用于步进过滤器:jira.codehaus.org/browse/GROOVY-4063。另见youtrack.jetbrains.com/issue/IDEA-51344
标签: debugging groovy intellij-idea closures iteration