目录
[1.为什么需要 Debug](#1.为什么需要 Debug)
[2.2.1 Step Over](#2.2.1 Step Over)
[2.2.2 Step Into](#2.2.2 Step Into)
[2.2.3 Force Step Into](#2.2.3 Force Step Into)
[2.2.4 Step Out](#2.2.4 Step Out)
[2.2.5 Run To Cursor](#2.2.5 Run To Cursor)
[2.2.6 Show Execution Poiint](#2.2.6 Show Execution Poiint)
[2.2.7 Resume Program](#2.2.7 Resume Program)
[3.多种 Debug 情况介绍](#3.多种 Debug 情况介绍)
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行断点
示例代码:
java
/**
* 行断点
*/
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方法断点
- 断点设置在方法的签名上,默认当进入时,断点可以被唤醒
- 也可以设置在方法退出时,断点也被唤醒
示例代码:
java
/**
* 方法断点
*/
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样例二
我们在父类打下断点,子类不打断点
运行时,子类明明没有断点,但是也停留了,这叫做方法的重写,子类重写父类的方法,即覆盖