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

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

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

相关推荐
耀耀_很无聊4 小时前
第1章 初识SpringMVC
java·spring·mvc
麻衣带我去上学4 小时前
Spring源码学习(一):Spring初始化入口
java·学习·spring
东阳马生架构4 小时前
MySQL底层概述—1.InnoDB内存结构
java·数据库·mysql
手握风云-5 小时前
数据结构(Java版)第一期:时间复杂度和空间复杂度
java·数据结构
坊钰5 小时前
【Java 数据结构】时间和空间复杂度
java·开发语言·数据结构·学习·算法
飞升不如收破烂~5 小时前
Redis的String类型和Java中的String类在底层数据结构上有一些异同点
java·数据结构·redis
苹果酱05675 小时前
windows安装redis, 修改自启动的redis服务的密码
java·开发语言·spring boot·mysql·中间件
feilieren5 小时前
信创改造 - TongRDS 替换 Redis
java·spring boot·后端
Allen Bright5 小时前
Jedis连接池的操作
java·redis
庞传奇6 小时前
【LC】560. 和为 K 的子数组
java·算法·leetcode