目录
1.为什么需要 Debug
2.Debug的步骤
2.1添加断点
2.2单步调试工具介绍
2.2.1 Step Over
2.2.2 Step Into
2.2.3 Force Step Into
2.2.4 Step Out
2.2.5 Run To Cursor
2.2.6 Show Execution Poiint
2.2.7 Resume Program
3.多种 Debug 情况介绍
3.1行断点
3.2方法断点
3.2.1样例一
3.2.2样例二
1.为什么需要 Debug
编好的程序在执行过程中如果出现错误,该如何查找并定位错误呢?简单的代码可以直接看出来,但如果代码比较复杂,就需要借助程序调试来查找错误了。
2.Debug的步骤
Debug(调试)程序步骤如下
- 添加断点
- 启动调试
- 单步执行
- 观察变量和执行流程,找到并解决问题
2.1添加断点
源代码文件中,在想要设置断点的代码行的前面的标记行处,单击鼠标左键就可以设置断点,在相同位置再次单击即可取消断点。
2.2单步调试工具介绍
2.2.1 Step Over
每点一次就执行一步(F8)
2.2.2 Step Into
进入到方法内部(F7)
2.2.3 Force Step Into
进入源码(Alt + Shift + F8)
2.2.4 Step Out
跳出当前方法(Shift + F8)
2.2.5 Run To Cursor
运行至光标所在行(Alt + F9)
2.2.6 Show Execution Poiint
显示断点所在位置(Alt + F10)
2.2.7 Resume Program
运行至下一断点 (F9)
在 Debug 过程当中,可以动态的下断点
3.多种 Debug 情况介绍
3.1行断点
示例代码:
/**
* 行断点
*/
public class Debug01 {
public static void main(String[] args) {
int m = 10;
int n = 20;
System.out.println("交换前:m = " + m + ", n = " + n);
swap(m, n);
System.out.println("交换后:m = " + m + ", n = " + n);
}
public static void swap(int m, int n) {
int temp = m;
m = n;
n = temp;
}
}
运行结果如下:
我们发现 m 和 n 的值实际上并没有交换,为了探究其原因,我们可以使用行断点进行调试
点击 Debug 后,程序会运行到第一个断点的位置上
此后,每次点击 Step Over 都会向下执行一步
调试到此处,我们选择 Step Into 进入到方法内部,若中途想要跳出当前方法,可以点击 Step Out;若仍点击 Step Over,则会将 swap 方法一次性执行完毕并执行到 main 方法的下一条语句
最后我们可以看到在 swap 方法中 m=20, n=10
但是在 main 方法中仍然 m=10, n=20
如果运行到第一个断点以后,想要直接运行到下一个断点,我们可以点击 Resume Program
3.2方法断点
- 断点设置在方法的签名上,默认当进入时,断点可以被唤醒
- 也可以设置在方法退出时,断点也被唤醒
示例代码:
/**
* 方法断点
*/
public class Debug02 {
public static void main(String[] args) {
//1.
Son instance = new Son();
instance.test();
//2.类的多态性
Father instance1 = new Son();
//3.接口的多态性
Consumer con = new ConsumerImpl();
con.accept("example");
//4.
HashMap map = new HashMap();
map.put("Tom", 12);
map.put("Jerry", 11);
map.put("Tony", 20);
}
}
class Father{
public void test() {
System.out.println("Father : test1");
System.out.println("Father : test2");
}
}
class Son extends Father{
@Override
public void test() {
System.out.println("Son : test1");
System.out.println("Son : test2");
}
}
interface Consumer{
void accept(String str);
}
class ConsumerImpl implements Consumer{
@Override
public void accept(String str) {
System.out.println("ConsumerImpl: " + str);
}
}
3.2.1样例一
点击 Debug 以后会停留在断点方法的第一行代码的位置
右键断点我们可以勾选此处,此后方法退出时断点也被唤醒
3.2.2样例二
我们在父类打下断点,子类不打断点
运行时,子类明明没有断点,但是也停留了,这叫做方法的重写,子类重写父类的方法,即覆盖