一、前言
在我们以往的程序执行中,只能看到控制台上展示的最终结果,无法直观清晰地看到程序内部每一个变量的加载,更迭,以及代码执行的内部逻辑。而Debug(断点调试),可以让我们打破这层壁障。就像三体中的从四维碎片看三维中的人类一样,人类的每一根血管每一个内部器官都清晰展现在眼前。Debug可以把程序的每一个细节和每一次变化展现在我们面前,让我们直观地看到程序执行的过程,了解代码执行的来龙去脉。
二、概述 :
断点调试是指在程序的某一行设置一个断点,调试时,程序执行到断点处就会停止,之后可以由程序员决定是否要继续往下调试,你可以手动控制一步一步往下执行,直至程序执行完毕;也可以设置多个断点,并直接跳转到下一个断点;或者直接退出调试。若程序报错,可以调试到出错代码行并停下,通过分析找到当前Bug。熟练掌握Debug,不仅可以帮助我们更容易理解源码,也可以帮助我们在开发中更容易找到Bug。
注意 :
在断点调试过程中,程序处于运行状态,且以堆内存中真正的对象来执行。
调试过程中可以看到各个变量当前的值。
调试过程中可以动态下断点。
若代码中一个断点都没有设置,那么Debug和普通运行的效果是一样的。
三、如何使用 :
1.IDEA中Debug常用的五个快捷键介绍 :
① F7 (跳入):跳入方法内。当调试到某个调用方法的语句时,你可以选择按下F7跳入该方法。
② Alt + Shift + F7 (跳入_牛逼版):强制跳入方法内。
PS :说到“强制”的问题就不得不提一嘴—— IDEA默认情况下不让你随便进入源码,但我们可以通过配置进行修改:
依次点击Setting ——> Build,Execution, Deployment ——> Debugger ——> Stepping,然后将“Do not step into the classes”中的java.*和javax.*取消勾选即可
③ F8(跳过):逐行执行代码,按一下F8就执行一行。(如果有循环结构,直到跳出循环)
④ Shift + F8 (跳出):跳出方法,与F7效果相对。比如,当我想在调试过程中查看方法源码时,我可以使用F7或者Alt + Shift + F7跳入方法;当我不想看了,想回去原来跳入方法前的地方,那么按下Shift + F8就 🆗了。
⑤ F9( resume(中断后继续)):按下F9可以立即执行到下一个断点处。
2.Debug界面图示 :
up先随便找个等会儿准备演示Debug的类,点击Debug即可进入Debug界面,如下图所示 :
Debug界面图如下所示 :
下面带大家简单“解剖”一下这张Debug界面图
首先,最上面这一栏是重要的功能区,如下图所示 :
1.左面的Debugger 和 Console分别代表了Debug界面 和 控制台界面,当Console左下角出现小图标时(就比如现在这样),说明控制台有信息打印出来,你可以点击Console跳转过去查看。
2.对于右面挨过来的这几个小图标(按照我们之前介绍五个快捷键时的顺序来) :
3.其次,下面那一块白色框区域,是实时显示变量的更迭和变化情况的,也就是变量区。
4.最左面那一栏,小按钮一堆,不用说也肯定是个功能区。这里我们只说两个按钮。
四、代码演示 :
测试数组下标越界异常:
以Demo_two类作为一个演示类,Demo_two类代码如下 :
public class Demo_two {
public static void main(String[] args) {
int[] array = new int[]{11, 5, 211, 985, 77};
for (int i = 0; i <= array.length; i++) { //
System.out.println("数组的第" + (i+1) + "个元素为 : " + array[i]);
}
System.out.println("-------------------------------");
System.out.println("for循环结束,程序退出。");
}
}
在第6行设置断点,进入Debug后通过F8(跳入)逐行调试代码。注意,数组下标都是从0开始的,所以我们一般用for循环遍历数组时,循环变量的范围通常是0 ≤ i < array.length。假设将i的范围写作现在这个样子:0 ≤ i ≤ array.length,因为数组最大的下标是array.length - 1,根本不存在array.length这个下标,因此肯定会报数组下标越界异常。
GIF演示图如下 :
大家注意看,当执行完第6行定义数组的代码时,变量区可以清楚地将数组的信息加载出来,比如数组的长度,以及每个元素的索引和值分别是什么。最重要的是,当i变量的值变成5时,理论上数组已经没有下标为5的元素了,但是我们就是要测试越界异常嘛,i = 5是仍然满足for循环的条件语句的。但是,当i = 5时,
变量区已经提示我们array[i] = java.lang.IndexOutOfBoundsException.....
这时候,如果接着执行F8操作,jvm就会在控制台打印出异常信息,并告诉你下标5越界啦,如下图所示 :
五、总结 :
Debug不仅可以帮助我们看清程序执行的来龙去脉,帮助我们清楚地展现出变量的更迭和变化情况;而且在实际开发中,Debug可以帮助我们更轻松地看懂源码,更容易找到程序的bug,因此,熟练掌握Debug对于一个程序员来讲非常重要。当然,本篇博文主要限于Debug的快速入门。Debug的实际应用之后也会出博文分享。感谢阅读!