说明:本文介绍IDEA中的Debug功能,基于2023.2(Ultimate Edition)版本
简单介绍
首先,在程序需要停止的所在行号上,鼠标左键,可设置一个断点,是一个红色圆点标志,表示程序使用Debug模式启动时,会在此位置停住。
另外,如果是正在运行中的项目,表示此断点可用状态,会额外有个√(所以,如果你是个微服务项目,有多个服务,而打的断点没有这个√,可能表示你目前打开的代码不是该服务的)
基础操作
现在,来介绍一下下面这一行图标表示的功能;
从左往右,分别是:
-
重新Debug运行程序(Ctrl + F5);
-
停止项目(Ctrl + F2);
-
程序继续运行,到下个断点所在的位置(F9);
-
暂停程序;
-
程序逐行运行(F8);
-
进入调用的方法(F7);
-
跳出调用的方法(Shift + F8);
-
查看断点视图,可看到程序中所有设置的断点(Ctrl + Shift + F8);
-
一键关闭所有断点;
更多功能点击最右侧的More
可展开;
常用的功能说明如下:
-
Force Step Over
:进入程序调用的JDK源码方法,如System.out.println()方法; -
Force Stem Over
:退出程序调用的JDK源码方法; -
Run to Cursor
:程序运行到光标所在的代码行(相当于在光标所在行打了一个断点,并使代码运行到这) -
Evaluate Expression...
:计算,可用于查看变量的值,计算表达式返回的结果;
以上功能,最常用的就是运行到下个断点
和计算
,可以方便我们定位到BUG所在的代码行。
高级用法
用法1:卡住符合条件的断点
如下一个for循环,如果我们只想当 i == 5 时,才让断点卡住。
for (int i = 0; i < 100; i++) {
System.out.println("i = " + i);
}
我们可以在左侧的断点图标上,鼠标左键,设置断点卡住的条件,如下,可以看到只有当 i == 5 时,断点才卡住;
用法2:对Stream流打断点
Stream流,是使用流的方式对集合数据进行一系列操作的代码,表现出来就是一行如下的代码;
// 创建一个字符数组
String[] strings = {"a", "b", "cd", "efg"};
// 使用stream流方式筛选出字符长度大于等于2的字符
Arrays.stream(strings).filter(s -> s.length() >= 2).forEach(System.out::println);
接着,我们在这打一个断点,可看到如下选项:
分别表示:普通断点、Lambda表达式断点、综合以上的断点;
-
普通断点:即程序允许至此停留,无法深入到Stream流内部;
-
Lambda表达式断点:针对Stream流中的表达式操作数据的过程拦截,如上,filter()方法相当于一个for循环,会依次拦截住每个元素;
-
综合:综合以上;
对于Stream流的代码,我们可以使用上面的Lambda断点来查看代码执行的情况,另外可以在断点卡住后,在More
里点击下面这个功能,Trace Current Stream Chain
;
它可以看到Stream流操作数据的每一个步骤的情况;
用法3:异常断点
当我们想要知道异常是哪一行代码抛出的,可点击下面的View Breakpoints
,在左边的列表里新增一个异常断点,表示卡住抛出此异常的代码,方便我们找到异常代码;
Debug启动程序,此时没有打任何断点,IDEA会自动帮我们卡住抛出异常的代码;
当然,也可以设置自定义的异常(我没试过,大家可以试试看)。
方法4:观察变量值
可以对某个变量的值进行观察,如下,我们想对变量count
的值进行观察,可以选中该变量,鼠标右键,选择Add to Watches
Debug启动程序,可在下面看到该变量的变化情况,还可以写计算表达式;