【发布时间】:2016-10-10 20:31:31
【问题描述】:
我是 Grails / Groovy 新手,我正在跟踪一些预先存在的代码。
看起来像这样:
def update(Long id, Long version) {
def skateBoardSkillsInstance = SkateBoardSkills.get(id)
if (!skateBoardSkillsInstance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'skateBoardSkills.label', default: 'SkateBoardSkills'), id])
redirect(action: "list")
return
}
if (version != null) {
if (skateBoardSkillsInstance.version > version) {
skateBoardSkillsInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
[message(code: 'skateBoardSkills.label', default: 'SkateBoardSkills')] as Object[],
"Another user has updated this SkateBoardSkills while you were editing")
render(view: "edit", model: [skateBoardSkillsInstance: skateBoardSkillsInstance])
return
}
}
skateBoardSkillsInstance.properties = params
if (!skateBoardSkillsInstance.save(flush: true)) {
render(view: "edit", model: [skateBoardSkillsInstance: skateBoardSkillsInstance])
return
}
flash.message = message(code: 'default.updated.message', args: [message(code: 'skateBoardSkills.label', default: 'SkateBoardSkills'), skateBoardSkillsInstance.id])
redirect(action: "show", id: skateBoardSkillsInstance.id)
}
让我惊讶的是当我追溯到第一次返回时。它似乎执行了返回,然后我在下一个 if。为什么没有返回?
[编辑] 我已经把这个例子写得更详细了。
好的,经过仔细(以及当天早些时候)检查,我所看到的更准确的描述是这样的。我追溯到“如果”条件。是评估的。如果条件为假,调试器将跳过该块,但在该块内的 return 语句处停止。很混乱。是否跳过了该块?我会尝试在块内放置一些断点。在“if”语句为真的情况下,它会执行该块并且确实似乎返回了......但是有两个步骤没有出现。执行点消失。这意味着我必须按两次 F8 才能返回。怀疑这是一些 Groovy 魔法。系统正在将某些东西放入其中。
【问题讨论】:
-
如果满足条件,它确实满足了,并且无论您使用什么追踪它都是错误的
-
当然可能,但似乎不太可能。如果我正在跟踪与二进制文件不匹配的代码,就会发生一些事情,比如我会看到明显错误的值,或者我会看到断点或步骤出现在空行上。我会对此持开放态度,但我认为这可能是我对 Groovy 和 return 关键字不了解的地方。
-
您使用的是什么 IDE?不同的 IDE 之间的解决方案可能会有所不同。
-
IntelliJ IDEA 2016.2.4.
-
怀疑的另一个原因是,自从它首次在这台机器上编译以来,这种方法还没有改变。从未如此不同。