Idea之debug中F7与Drop Frame的那点事

在idea的debug中,有很多调试的快捷键,比如F5进入到方法内、F6跳过方法往下执行、F8执行到下一个断点(如果没有下一个断点,则执行到结束)。本文主要介绍F7和Drop Frame的使用,以及它们之间的区别。
1、F7
首先,我们写一段测试代码:

1 public class Main { 2public static void main(String[] args) { 3StringBuilder param = new StringBuilder("123"); 4String str = getString(param); 5System.out.println(str); 6} 7 8private static String getString(StringBuilder pa){ 9pa.append(34); 10System.out.println(11); 11return "33"; 12} 13}

【Idea之debug中F7与Drop Frame的那点事】上面是一段简单的代码,在main()方法内调用了getString()方法,该方法返回一个字符串。下面我们在第10行打一个断点,在debug模式下运行:
Idea之debug中F7与Drop Frame的那点事
文章图片

这时pa的值时“12334”,此时按快捷键F7,得到下面的结果:
Idea之debug中F7与Drop Frame的那点事
文章图片

从上面可以知道,当回退到被调方法后,pa的值也是“12334”。同时从标注看到getString()方法执行结束了,返回了“33”。这时按F6或者F5就不会进入getString()方法内,按F8会打印出“33”。
由此我们可以得出以下结论:
(1)F7的确回退到main()方法
(2)回退之后,原先的变量值不能回退,变量值是执行完调用方法后的值。
(3)回退之后,再按F5也不会进入到getString()方法,因为已经执行完了。
(4)F7等价于F5+F6
2、Drop Frame
该功能也是回退到被调用方法处,但是它和F7有几个很重要的区别。同样,在debug模式下运行,再点击Drop Frame:
Idea之debug中F7与Drop Frame的那点事
文章图片

Idea之debug中F7与Drop Frame的那点事
文章图片

由调试可知,其和F7有以下区别:
(1)回退之后,getString()方法并没有执行完,也没有返回”33”。
(2)回退之后再按F5或者F6,又会进入到getSring()方法体内。
当然也有相同点:
(1)回退之后,如果在getString()方法中修改了实参值,那么F7和Drop Frame都不能还原实参的值。
总结:本文主要介绍,F7和Drop Frame的区别。其中,F7回退之后,调用方法执行完回退。Drop Frame是回退之后,在调用方法当前断点返回,不会执行结束。它们的共同点就是,实参值都不能回退。
彩蛋:现在有个问题,先说问题来源:
首先,F7是执行完调用方法返回,而Drop Frame虽然不执行完调用方法返回,但是按F5或F6还会进入到调用方法内。那如何做到我想结束调用,且不想执行完调用方法,同时按F5或F6也进不到调用方法内呢?
方法:找到frames标签,右键点击正在执行的方法,选择Force Return会让你填写该方法的返回值,如下图:
Idea之debug中F7与Drop Frame的那点事
文章图片
Idea之debug中F7与Drop Frame的那点事
文章图片

点击OK之后,getString()方法会返回“11”,同时也不会往下执行getString()方法。但是,同样Force Return 也不能还原实参值。

    推荐阅读