在 Intellij 进行调试时,我可以在返回之前找到返回值吗?

配合:

Object method(){
...
return /* some complex expression */
}

有没有什么方法可以看到在调试时返回什么值?比如设置一个断点,在返回之后立即命中,但在执行之前转到调用代码?我希望能够知道返回值是什么,并且能够看到所有局部变量的值是什么。

我现在的方法是创建一个临时变量: Object ret = /* something complex */; return ret;。但是,这是一个麻烦,也增加了额外的不必要的代码行。

注意: 这个问题和 在 VisualStudio 中调试时返回值之前,是否可以找到返回值是一样的,但是对于 intellij。

46547 次浏览

调试器面板调试器面板中有一个 Watch 方法返回值按钮。

Watch 方法返回值 : 单击此按钮查看最后执行的方法的返回值。

watch method return values

IDEA 12配置:

IDEA 12

似乎有几种方法可以做到这一点。第一个涉及到在方法签名上设置断点,在您的情况下,您将在 Object method (){上设置断点。这将允许您监视该方法的入口和出口。我相信你必须结合使用这个“ Watch 方法返回值”,如上所述,但我还没有能够完全测试这个,因为它需要太长的时间来计算。注意,这确实会大大降低调试器的性能,并且需要更长的时间来调试。

还可以手动执行以下操作。

  1. 在返回行上设置断点。
  2. 当点击返回行时,单击返回行,特别是将光标放在您想要看到的操作上,然后转到 Run-> Evalude Expression (或 Alt-F8) ,它应该在该点运行表达式并返回它所返回的内容。

注意 : 如果您创建了一个断点,您可以告诉 IDEA 许多事情来处理它们,例如,如果您在一个断点上中断,您可以告诉它们执行一个表达式并将其记录下来。如果右键单击断点并单击属性,您可以查看可以做什么。

更新 : 试着把这个和第一种做法结合起来。不要使用“监视方法返回值”,因为它似乎会减慢或冻结调试会话。相反,请执行以下操作

  1. 右键单击要查看的返回表达式,然后单击“添加到手表”
  2. 接下来像上面提到的那样添加一个方法断点。
  3. 调试程序时,方法将在方法签名上中断。
  4. 按 F9键继续,它应该再次中断 返回表达式已经计算出来,你的返回表达式应该在手表列。

请记住,方法断点比较慢,所以可能需要更多的时间,如果您注意到性能受到太多影响,一个微妙的改进方法是只设置返回语句断点(没有方法断点) ,然后添加方法断点 ,返回语句断点命中,然后继续。

希望这对你有帮助,

在 IntelliJ IDEA 2016.3上: 它隐藏在调试面板的齿轮按钮内。确保 Show Method Return Values检查过了

IntelliJ IDEA 2016.3 "Show Method Return Values"

使用调试器将希望看到返回值的函数设置为 打破内心的某个地方

step into function

退出函数的 (或者 过来,直到你退出) :

step out

请注意,返回值出现在变量中:

observe the return value

这个问题已经提出一段时间了,但是当我想要处理这种情况时,我使用了一种不同的方法。

在调试时,您可以标记表达式(在您的情况下,表达式就在“返回”之后) ,然后点击 CTRL + ALT + F8(快速评估表达式)。IntelliJ 将弹出一个小窗口,显示将返回的值。

由于接受的答案并没有完全回答我需要这个的所有情况(或者至少我不能让他们阅读说明) ,我觉得可以自由地发布一个答案来解决我的具体情况。

在尝试检查返回值时,我有一些额外的要求。

  1. 我不想离开我们从中返回的方法的作用域。

  2. 我不想打电话 方法在返回语句中执行两次(一次用于检查,一次用于检查 当实际返回时) ,正如在示例中使用 Math.random()很好地演示的那样。

对我来说,这个解决方案是相当出乎意料的。在对 过来(相对于 出来)进行修改之后,我想出了以下结构:

而不是利用

private double rand() {
return Math.random();
}

我吸毒

private double rand() {
return
Math.random();
}

当光标位于 Math.random()时,选择 过来,它将在监视窗口中显示该值,而不会离开 rand()的调用范围。

因此,如果 return关键字与您试图检查的表达式在同一行上,那么在接受的答案中提到的 过来似乎并不能解决这个问题。从句法的角度来看,这当然是有意义的。

我想这仍然会给自动格式化程序带来问题,因为它会将这两行缩减为一行,但是对我来说,这最终解决了我的调试问题。