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

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

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

相关推荐
阿伟*rui1 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
XiaoLeisj3 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck3 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei3 小时前
java的类加载机制的学习
java·学习
Yaml45 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~5 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616885 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7895 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java6 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
睡觉谁叫~~~6 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust