JAVA8 debug 技巧

调试按钮说明

img

img

Stream 调试

实例代码:

1
2
3
4
5
6
7
// 1.Stream 调试
List<Integer> list1 = Lists.newArrayList(1, 5, 3, 2, 4);
List<Integer> list2 = list1.stream()
        .filter(o -> o > 2)
        .sorted()
        .collect(Collectors.toList());
System.out.println(list2);

在 stram() 处设置断点,debug 运行。

可以看到Debug视图中 Trace Current Steam Chain 图标会点亮。

img

点击该图标弹出 Stream Trace 视图。可以看到 filter、sorted、collect 每一个方法执行之后的结果。

img

ok,成功。

Optional 调试

实例代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 2.Optional 调试
User user = new User()
        .setId(1)
        .setName("tom")
        .setArea(new Area().setProvince("beijing"));

String province = Optional.ofNullable(user)
        .map(User::getArea)
        .map(Area::getProvince)
        .orElse("未知");
System.out.println(province);

在 Optaionl 处加断点,debug 运行,可以看到 Evaluate Express 图标。

img

点击该图标弹出 Evaluate 视图,输入需要调试的代码,点击右下角 Evaluate 图标,可以看到执行结果。

img

注:Optaionl 不像 Stream 那样,有专门的调试器,他需要借助 Evaluate Express 视图完成调试。

条件断点

实例代码:

1
2
3
4
5
// 3.条件断点, 循环
List<Integer> integerList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
for (Integer x : integerList) {
    System.out.print(x);
}

有时候在循环中调试时,我们希望只关心我们需要关心的那个对象,但是一次循环记录有很多,每一个都跟一遍很是麻烦,那么条件断点就可以上场了。

在需要的地方加断点,在断点上右键弹出条件断点视图,输入条件表达式,点击 Done。

img

然后 debug 运行, 只有当 x 的值为 5 的时候才会停住,进入断点。

多线程调试

实例代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 4.多线程调试
new Thread(() -> {
    System.out.println("线程1执行");
}, "线程1").start();

new Thread(() -> {
    System.out.println("线程2执行");
}, "线程2").start();

System.out.println("主线程");

线程的执行时间是有系统分配,开发人员无法控制,但是通过Idea 专用的线程调试功能可以很好的选择要执行的线程代码,达到调试代码的目的。

先在线程内设置断点,在断点上右键选择 Thread 类型。

img

然后 debug 运行项目,在 Debug 的 Frames 视图可以方便的选择要执行的线程,选择后可继续一步步调试代码。

img

方法回退

实例代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public static void method1() {
    System.out.println("method1");
    method2();
}

public static void method2() {
    System.out.println("method2");
    method3();
}

public static void method3() {
    System.out.println("method3");
}

public static void main(String[] args) {
    method1();
}

通过工具栏里的按钮可回退到上一步。

通过选中方法右键选择 Drop Frame 可回退到指定的方法。

如:阅读Spring IOC 启动流程源码时,方法调用都很深,想退回来再看看上一步做了啥,用方法回退很方便。

但是对于修改了共享数据的方法,如果回退再执行一次,可能产生异常数据。

img

强制返回

Debug 调试代码时,跟到一个无关痛痒的方法,有时候我们希望提前返回,可以使用下面的方法强制返回一个指定的值。

选择方法右键,选择Fore Return。

img

会弹出一个窗口,输入要返回的值即可。

img

热修改变量的值

有时候,在Debug 的过程中我们想调整一个参数的值又不想重启项目,可以使用Idea提供的实时修改变量值的功能。

首先在 Variables 视图选要修改的变量,右键选择Set Value。

img

输入要修改的内容,回车可进行热修改。

img

0%