写代码离不开调试,调试离不开断点。
IDEA 对于断点的反对十分丰盛。把握这些技巧当前,能够大大的晋升开发效率。是帮忙程序员保住头发,远离 996 的秘密武器。
断点类型
IDEA 反对以下四种断点类型:
- 行断点(Line breakpoints):最罕用的一种,能够设置在任意可执行的代码行下面。
- 办法断点(Method breakpoints):设置在办法签名上,当进入或退出办法时,断点可被唤醒。
- 字段断点(Field watchpoints):设置在字段(成员变量)上,当该字段被读取或者赋值时断点被唤醒。
- 异样断点(Exception breakpoints):当抛出指定异样时断点被唤醒。
行断点
行断点,在日常开发中最罕用的形式。增加一个行断点很简略,在须要增加断点的 gutter 上鼠标左键单击,或者光标定位到须要设置断点的代码行,按 Ctrl + F8 即可。
断点增加胜利后,gutter 上会显示一个红色的圆点。接下来,应用 Debug 形式运行程序,就能够对代码进行调试了。
办法断点
办法断点你可能之前没有用过,但如果你有浏览源码的习惯,那么你须要好好利用一下这个就家伙了。
增加办法断点和增加行断点的步骤一样,两者只是外观上有些不同,办法断点用红色的菱形示意。
那么办法断点有什么用呢?举个例子:
有如上类关系,代码实现如下:
public class ServiceImplA implements Service{
@Override
public String method() {return "hello A";}
}
public class ServiceImplB implements Service{
@Override
public String method() {return "hello B";}
}
有如下调用:
public String hello() {
// 假如通过看代码很难确定是哪个实现类的实例
Service service = createService();
return service.method();}
这个时候,咱们不能一眼看出 service 是 ServiceImplA 的实例,还是 ServiceImplB 的实例(这个例子代码比较简单,像 Spring 这类开源框架要简单很多,看过源码的话都有领会)。
接下来就是办法断点表演的时刻了,在接口 Service 的 method() 上打一个断点:
运行程序,查看成果:
能够看到,hello() 办法中的 service.method() 真正调用的是 ServiceImplA 的 metho() 办法。
另外,办法断点还反对以下配置:
其中,Method entry 和 Method exit 二者至多要抉择一个(如果进入办法和退出办法都不选,那办法断点也就没啥用了)。
字段断点
字段断点也是一个看源码的神器。当一个成员变量被多方援用时,它能够精准的找到谁读取、批改了它的值。
字段断点用一个红色的眼睛示意,堪称是十分形象了。就像给成员变量专门安顿了一个盯梢的人,有什么打草惊蛇第一工夫告诉你。
运行程序,看下成果:
能够看到,精准的定位到 hello 被赋值的地位。
字段断点还反对以下配置:
同样,Field access 和 Field modification 起码选一个。
异样断点
异样断点在咱们修复 bug 的时候很有用。能够精准的定位到产生(指定类型)异样的代码行。
异样断点用一个红色的闪电示意(断点响应当前才会显示)。
应用快捷键 Ctrl + Shift + F8 关上断点治理对话框,按如下步骤进行增加:
设置断点响应的异样类型:
运行程序,查看成果:
能够看到,当产生(指定类型)异样后,程序停在了产生异样的代码行,并在后面放一个红色的闪电,揭示你就是这行代码要搞事件。
断点还反对以下配置:
同样,Caught exception 和 Uncaught exception 起码选一个。
更多玩法
应用快捷键 Ctrl + Shift + F8 关上断点治理对话框,能够解锁更多断点的玩法:
比方能够设置断点在满足指定条件时才响应:
更多玩法留给你去摸索。
断点图标
上面是 IDEA 中各种类型断点在不同状态下的图标示意: