Eclipse的Debug功能
运行程序,没有报错(出现异常),但结果不正确,这种时候,错误很难定位,就需要借助Debug工具,(或者系统比较大的时候,某个地方出错,很难定位)
如何调试程序:
① 方式一:System.out.println(),边看边输出,只适合程序不大的时候
② 方式二:Eclipse - Debug调试功能
一、如何调试
- 设置断点
注意:可以设置多个断点 - Debug As Java Application
注意:在执行到断点之前,不会自动启动Debug视图,相当于依然在执行Run As的功能
- 常用操作
操作 | 作用 |
---|---|
step into 跳入(f5) | 进入当前行所调用的方法中 |
step over 跳过(f6) | 执行完当前行的语句,进入下一行 |
step return 跳回(f7) | 执行完当前行所在的方法,进入下一行 |
drop to frame | 回到当前行所在方法的第一行 |
resume 恢复 | 执行完当前行所在断点的所有代码,进入下一个断点,如果没有就结束 |
Terminate 终止 | 停止 JVM, 后面的程序不会再执行 |
详细解释:
-
step over:执行完当前这一行的语句,进入到下一行语句(还没执行下一行);
-
step into:进入当前行所调用的方法内部;
【如果一行代码是调用方法,那么step into是进入方法内部(可以一行一行执行方法内的代码),step over则是直接执行完该行代码(即:方法整个执行完并且得到相应返回值)】 -
step return:在step into进入某方法内部时,已经检查的差不多了(通常不用整个方法都检测是否有错),想要返回到原先程序流程中,就用step return;
-
drop to frame:在step into进入某方法内部时,通过step over一步一步执行,可能某一步没看清楚,想再看一遍,就使用drop to frame回到该方法起始位置,可以重新再来推进;
-
resume:推进到下一个断点处,如果没有断点了就执行到程序结束;
【程序执行过程中的输入操作,也会阻塞(要等待用户输入),并不是点了resume就会到达下一个断点】 -
terminate:直接终止程序,不看了;
二、测试代码
测试代码 1:
public class DebugTest {
public static void main(String[] args) {
int i = 10;
int j = 20;
System.out.println("i = " + i + ", j = " + j);
DebugTest test = new DebugTest();
int max = test.getMax(i, j);
System.out.println("max = " + max);
}
private int getMax(int k, int m) {
int max = 0;
if (k < m) {
max = k;
} else {
max = m;
}
return max;
}
}
测试代码 2:
public class DebugTest1 {
public static void main(String[] args) {
int[] arr = new int[] {1,2,3,4,5};
System.out.println(arr); //输出的是地址值
char[] arr1 = new char[] {'a','b','c'};
System.out.println(arr1); //输出的是字符串"abc"
}
}
- 之前测试的时候,发现同为基本数据类型,int[] arr 等执行System.out.println(arr); 输出的就是地址值,但是 char[] arr1 输出的是字符串"abc";
- 当时就已经知道调用的是重载方法,现在则可以通过debug再次验证:通过step into发现,进入的是不同的方法,int[] arr 执行 System.out.println(arr); 进入的是 println(Object x) ,而 char[] arr1 进入的是 println(char x[]);
三、点击step into时可能存在的问题
- 点击 step into 时,本应跳转进入当前行代码调用的方法的方法体内,但是有的人点击 step into 后,执行的操作和 step over 一样,即直接执行到下一行代码了
- 究其原因,十有八九是因为Debug Configurations中的JRE使用的是独立装的jre,而不是jdk中的
右键 —> Debug As —> Debug Configurations
选择JRE(如果有问题,很可能就是这里的jre选择错误) —> Installed JREs
接下来就是 Remove 掉原来的jre,然后 Add 中添加 Standard VM,找到jdk的目录并确认,并把对勾打上,就可以了