编程过程中如果出现错误,需要查找和定位错误时,借助程序调试可以快速查找错误。
编写好程序后,可能出现的情况:
1.没有bug。
使用Debug的情况:
2.运行后,出现错误或者异常信息,但是通过日志文件或者控制台,显示了异常信息的位置。
3.运行后,得到了错误的结果。
4.运行后,得到了正确的结果,但是在大量、多次运行后,出现了错误的结果。
(例1:多线程情况下,处理线程安全问题。例2:不同格式的输入数据,出现错误结果。)
1. Debug的步骤
1.添加断点。
2.启动调试。
3.单步执行。
4.观察变量和执行流程,找到并解决问题。
1.1 添加断点
在源码文件中,在想要设置断点的代码行的前面标记行处,单击鼠标左键出现红色圆点,就设置了一个断点。再次单机红色圆点行,就可以取消断点。
1.2 运行调试
单机臭虫,Debug调试运行代码,会停在断点位置。且在调试过程中,可以动态添加或取消断点。
1.3 调试工具按钮介绍
1. 步过:
开始运行下一步代码,不是下一个断点。且不进入方法内部。
2. 步入、强制步入:
开始运行下一步代码,且可以进入当前这一行代码调用的方法或构造器内部。
区别:
步入:只能进入自己写的方法或构造器内部。
强制步入:可以进入自己写的方法或构造器内部,也可以进入SDK定义的源码中的方法内部。
3. 步出:
跳出当前这一行代码调用的方法、构造器、源码方法。
4. 运行到光标处:
直接跳到光标所在位置。如果中间有调试标记行,那还是会先进行调试行,再跳转。
5. 恢复程序:
1. 如果后面没有断点,则结束调试,直接出结果。
2. 如果后面有断点,则直接进入下一个断点位置。
6. 停止调试:
7.查看所有断点:
显示整个程序执行过程中添加断点的位置。
8. 显示执行点:
显示当前代码正在执行哪一行的断点。
9. 静音断点:
使得当前代码后面所有断点失效,一次执行到底。
2. 多种Debug情况介绍
2.1 方法断点
在方法上设置断点,显示红色菱形块。右键单机菱形块,可以看到监视。
方法输入:默认勾选,表示进入方法时,断点可以被唤醒。
方法退出:需手动勾选,表示在方法退出时,断点也被唤醒。
方法的覆盖:
子类调用父类方法的时候,如果父类方法中有方法断点,则子类运行调试时一样会进入父类方法停留调试。
例如,我们进入源码,把源码某个方法设置断点,那么,调试代码中调用这个方法的时候,就会出现断点调试。
2.2 字段断点
在类的属性声明上打断点,默认对属性的修改操作进行监控。每次修改这个属性,都会停留。
当勾选“字段访问”时,每次获取(例如打印)这个变量值,调试也会停留。
2.3 条件断点
设置断点之后,写上执行这个断点的条件。不满足条件的时候,断点不会执行。
2.4 异常断点
对异常进行跟踪,如果程序出现指定异常,程序就执行断点,自动暂停。
例如:设置出现空指针异常,就打断点。
操作:点击查看所有断点按钮,添加断点,选择Java异常断点,搜索空指针异常进行添加,看到已勾选这个断点,点击完成。下次出现这个异常,异常那一行就会出现闪电标识的断点。
2.5 线程调试
挂起线程,输入条件,执行调试到满足该条件的线程,就会暂停。
2.6 强制结束(强制返回)
调试过程中已经发现问题,不希望程序继续执行。
可以选择强制结束(Force Return),然后点击恢复恢复程序,就直接结束了。
但是,如果在程序正在调用方法,方法需要一个返回值才能结束,就会出现。
这就比较麻烦了,写不出对的返回值,就只能继续执行完这个方法。
2.7 自定义调试数据视图
在调试面板的空白处右键,选择自定义数据视图。
出现这个框:
例如:
2.8 常见问题
问题:使用Step into(步入)时,会出现无法进入源码的情况,怎么办?
方案1:使用force step into(强制步入)。
方案2:点击进入如下页面,把java.*、javax.*取消勾选。(不建议)
使得步入和强制步入完全一样,没有区别。