【java基础】IDEA 的断点调试(Debug)

目录

[1.为什么需要 Debug](#1.为什么需要 Debug)

2.Debug的步骤

2.1添加断点

2.2单步调试工具介绍

[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 情况介绍)

3.1行断点

3.2方法断点

3.2.1样例一

3.2.2样例二


1.为什么需要 Debug

编好的程序在执行过程中如果出现错误,该如何查找并定位错误呢?简单的代码可以直接看出来,但如果代码比较复杂,就需要借助程序调试来查找错误了。

2.Debug的步骤

Debug(调试)程序步骤如下

  1. 添加断点
  2. 启动调试
  3. 单步执行
  4. 观察变量和执行流程,找到并解决问题

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样例二

我们在父类打下断点,子类不打断点

运行时,子类明明没有断点,但是也停留了,这叫做方法的重写,子类重写父类的方法,即覆盖

相关推荐
云烟成雨TD6 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
于慨6 小时前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
swg3213216 小时前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
gelald6 小时前
SpringBoot - 自动配置原理
java·spring boot·后端
殷紫川6 小时前
深入理解 AQS:从架构到实现,解锁 Java 并发编程的核心密钥
java
一轮弯弯的明月6 小时前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
chenjingming6666 小时前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
殷紫川6 小时前
深入拆解 Java volatile:从内存屏障到无锁编程的实战指南
java
eddieHoo6 小时前
查看 Tomcat 的堆内存参数
java·tomcat
那个失眠的夜6 小时前
Mybatis延迟加载策略
xml·java·数据库·maven·mybatis