Debug

news2025/3/10 18:27:10

0、Debug的步骤

Debug(调试)程序步骤如下:

1、添加断点

2、启动调试

3、单步执行

4、观察变量和执行流程,找到并解决问题

 1、添加断点

        在源代码文件中,在想要设置断点的代码行的前面的标记行处,单击鼠标左键就可以设置断点,在相同位置再次单击即可取消断点。

 2、启动调试

示例代码:
 

public class Debug01 {
    public static void main(String[] args) {
        //1.
        int m = 10;
        int n = 20;
        System.out.println("m = " + m + ",n = " + n);
        swap(m, n);
        System.out.println("m = " + m + ",n = " + n);
        //2.
        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
    }

    public static void swap(int m, int n) {
        int temp = m;
        m = n;
        n = temp;
    }

}

    启动调试:IDEA提供多种方式来启动程序(Launch)的调试,

              分别是通过菜单(Run –> Debug)、图标(“绿色臭虫”)等等

        如果你还是用Run启动,那就不会出现debug效果,断点跟没有打一样:

         启动调试:方法一

         方法二

        方法三:

 代码会停留在我们第一个打断点的位置:只是走到这个断点的位置,此行代码还没有被执行:

1、 Step Over(F8):

        单步执行,进入下一步,如果当前行断点是调用一个方法,则不进入当前方法体内:


蓝色高亮的那一行是我们即将要执行的语句,不是已经执行完毕的语句

单步执行,如果当前行断点是调用一个方法,则不进入当前方法体内,也就是说你看不到方法内部的执行情况,这里你看不到swap(m,n)的执行情况,此时你要用到:

当我们点击Step into时: 

 再Step into一下:

 跳出此方法:

 如果你现在在main方法中,你点击step out的话,main方法就执行结束了,结束的是当前方法!

Resume Program(F9):恢复程序运行,但如果该断点下面还有断点则停在下一个断点上:

Run to Cursor(Alt + F9):直接跳到光标处继续调试 

多种Debug情况介绍

行断点

断点打在代码所在的行上。执行到此行时,会停下来。我们上面的例子都是行断点

方法断点

        断点设置在方法的签名上,当执行此方法时,断点可以被唤醒,也可以设置在当执行完方法退出时,断点也被唤醒:

进入方法的时候会做一个停留,你也可以设置当执行完方法的时候也做一个停留 

在多态的场景下,在父类或接口的方法上打断点,会自动调入到子类或实现类的方法:

如果我对父类中的方法、接口中的抽象方法进行方法断点呢?

当调用了子类的test方法时:(我们明明没在子类的test方法上打断点,但是也停留了)

同理,直接唤醒到我们接口的实现类方法的位置:

你也可以对源码进行方法断点!

字段断点

在进行修改的时候就会起作用


public class Debug03 {
    public static void main(String[] args) {
        Person p1 = new Person(3);
        System.out.println(p1);
    }
}
class Person{
    private int id = 1;
    private String name;
    private int age;
    public Person() {
    }
    {
        id = 2;
    }
    public Person(int id) {
        this.id = id;
    }
    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

id变量默认值为0,所以赋值为1也算作修改:private int id = 1;

当调用对属性值进行修改的地方就会起作用,读取属性值不起作用:

                        这样的话除了前面的三次停留,还会有第四次停留:

        如果你的程序中发现你的某个字段值并不是你想要的结果,那么你就可以加上字段断点,看看有哪些地方对它进行了修改。 

 条件断点

                        在满足某个条件的情况下,断点就会起作用!

public class Debug04 {
public static void main(String[] args) { 
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10,11,12};
        for (int i = 0; i < arr.length; i++) {
             int target = arr[i];
             System.out.println(target);
        }
    }
}

                针对上述代码,在满足arr[i] % 3 == 0的条件下,执行断点:  

 异常断点

        对异常进行跟踪。如果程序出现指定异常,程序就会执行断点,自动停住

 程序出异常了,在终止之前,这个debug就会起作用

public class Debug05 {
        public static void main(String[] args) {
            int m = 10;
            int n = 0;
            int result = m / n;
            System.out.println(result);
            // Person p1 = new Person(1001); 
            // System.out.println(p1.getName().toUpperCase());
        }
}

                                 你现在可以点击➕,来添加一个异常断点:

              以Debug的方式启动程序,此时代码就停留在这里了,因为出现了一个算数异常 

你也可以加上其他异常断点,例如空指针异常:

 

线程调试:

public class Debug06 {
        public static void main(String[] args) {
                test("Thread1");
                test("Thread2");
}
public static void test(String threadName) { 
            new Thread(
                   () -> System.out.println(Thread.currentThread().getName()),
                   threadName
                    ).start();
            }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1328774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据

1.File&#xff08;操作文件本身&#xff09; 1.定义 目录 2.常用方法 3.路径引用符 可以用/或者\\分隔路径 还可以用File.separator分隔路径&#xff0c;会根据不同系统使用啥分隔符。 4.绝对路径、相对路径及桌面路径表示 桌面路径为&#xff1a; 我电脑的用户名为X 5.示例…

RobotMaster学习——工序导入,参数设置,轨迹生成

目录 引出1.导入工序2.修改刀具其他刀具参数 3.进行工序分配4.设置TCP5.设置工作站6.工序整体导入配置7.进行计算 总结 引出 RobotMaster的操作流程&#xff0c;从导入工序到生产轨迹。 1.导入工序 2.修改刀具 要选择第七把刀具 其他刀具参数 第一把刀具 第二把刀具 第三把刀…

Certum属于企业的泛域名ssl证书

泛域名SSL证书可以保护主域名以及其下所有二级域名&#xff0c;所以也可以叫它通配符SSL证书。Certum旗下有两种泛域名SSL证书&#xff0c;一种是入门级的泛域名SSL证书&#xff0c;支持个人或者企事业单位申请&#xff0c;一种是企业泛域名SSL证书&#xff0c;只能企事业单位申…

Sublime Text 3配置 C# 开发环境

Sublime Text 3配置 C# 开发环境 一、引言二、主要内容1. 初识 Sublime Text 32. 初识 C#3. 接入 .NET Framework3.1 下载 .NET Framework3.2 环境变量配置 4. 配置 C# 开发环境5. 编写 C# 代码6. 运行 C# 代码 三、总结 一、引言 C# 是一种面向对象的编程语言&#xff0c;由微…

STL中优先队列(堆)的详解

文章目录 priority_queue的基本介绍堆(heap)堆的概念与结构 priority_queue 的介绍与使用 priority_queue的基本介绍 这个priority_queue翻译成中文就是优先级队列&#xff0c;但其实我们很难去一眼看出他的意思到底是什么&#xff0c;他的逻辑结构实际上类似于数据结构中的堆…

深度剖析:Golang中结构体方法的高级应用

深度剖析&#xff1a;Golang中结构体方法的高级应用 引言结构体方法的基础回顾结构体的定义和用法方法的定义和绑定基本语法和用法 高级特性与应用封装、继承和多态方法集与接口的关系结构体方法的匿名字段和嵌入结构体 性能优化与最佳实践接收器类型的选择&#xff1a;指针还是…

SpringIOC之LocaleContext

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

听GPT 讲Rust源代码--src/tools(23)

File: rust/src/tools/clippy/rustc_tools_util/src/lib.rs 在Rust源代码中&#xff0c;rust/src/tools/clippy/rustc_tools_util/src/lib.rs文件的作用是为Clippy提供了一些实用工具和辅助函数。 该文件中定义了VersionInfo结构体&#xff0c;它有三个字段&#xff0c;分别为m…

【toolschain algorithm cpp ros】cpp工厂模式实现--后续填充具体规划算法,控制器版的已填充了算法接入了仿真器

写在前面 现在局势危机&#xff0c;于是想复习一下之前写的设计模式&#xff0c;之前提到&#xff0c;做过一个闭环仿真器&#xff08;借用ros&#xff09;&#xff0c;见https://blog.csdn.net/weixin_46479223/article/details/134864123我的控制器的建立遵循了工厂模式&…

AI绘画中VAE压缩图像

介绍 在Stable Diffusion中,所有的去噪和加噪过程并非在图像空间直接进行,而是通过VAE模块将图像编码到一个低维空间。 这个低维空间的“分辨率”低于原始图像空间,有利于快速地完成加噪和去噪过程。 最后再将编码空间中的噪声表示解码恢复为图像空间,完成去噪或加噪操作。 …

只知道短视频和直播带货?抖店好像更适合我们普通人哦!项目介绍

我是王路飞。 说道带货&#xff0c;大多数人还是只知道抖音短视频和抖音直播带货。 毕竟&#xff0c;现在众多平台都在往电商方向发展&#xff0c;做电商的方式就是通过短视频和直播的形式带货。 但是&#xff0c;很明显不是所有人都能去做的&#xff0c;尤其是对我们这些普…

操作系统期末知识点总结

第一章 1、操作系统&#xff1a;OS是一个大型的系统软件、它负责计算机的全部软件和硬件资源的管理&#xff0c;并为用户提供良好的应用界面&#xff0c;使整个计算机系统实现高效率和高度自动化 2、操作系统的形成 1&#xff09;手工操作阶段 2&#xff09;批处理系统&…

houdini 常用节点

雾化 撒点 减面 点连线 trace 节点 labs skelete 图片转模型 齿轮制作 polyextrude point to point connect primuv

【前缀和】【单调栈】LeetCode2281:巫师的总力量和

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调栈 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 作为国王的统治者&#xff0c;你有一支巫师军队听你指挥。 给你一个下标从 0 开始的整数数组 strength &…

Sui 生态排名第一的头部流动性协议 NAVI Protocol 活动进行中

作为在熊市中启动的新生公链&#xff0c;Sui 正在稳步崛起。公链的 TVL 持续攀升&#xff0c;目前已经达到了 1.76亿美元&#xff0c;闯入了公链排名前20榜单。仅过去四个月内&#xff0c;TVL 增加了10倍&#xff0c;并且增长仍在继续&#xff0c;SUI 的价格在近期也有了很亮眼…

Android Studio 安装和使用

前些天&#xff0c;打开了几年前的一个Android Studio app项目&#xff0c;使用安卓虚拟机仿真app崩溃&#xff0c;怀疑是不是中间升级过Android Studio导致异常的&#xff0c;马上脑子一热卸载了&#xff0c;结果上次踩过的坑&#xff0c;一个没少又踩一次&#xff0c;谨以此文…

Python中实现消息队列:构建高效异步通信系统的完整指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 消息队列的基础概念 在开始之前&#xff0c;先了解一些消息队列的基础概念。 1 什么是消息队列&#xff1f; 消息队列是一种通信方式&#xff0c;它允许将消息从一个应用程序传递到另一个应用程序。消息队列提…

[笔记]netty随笔

记录使用过程中偶然发现的一些关键逻辑。先做记录&#xff0c;以后netty知识有一定体系再做整理 childGroup 服务器中有俩group&#xff0c;一个是parentGroup&#xff0c;负责处理链接请求&#xff0c;一个是childGroup&#xff0c;负责业务逻辑。 channelActive是在childG…

Chrome浏览器http自动跳https问题

现象&#xff1a; Chrome浏览器访问http页面时有时会自动跳转https&#xff0c;导致一些问题。比如&#xff1a; 开发阶段访问dev环境网址跳https&#xff0c;后端还是http&#xff0c;导致接口跨域。 复现&#xff1a; 先访问http网址&#xff0c;再改成https访问&#xf…

Ubuntu 常用命令之 exit 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 exit命令在Ubuntu系统下用于结束一个终端会话。它可以用于退出当前的shell&#xff0c;结束当前的脚本执行&#xff0c;或者结束一个ssh会话。 exit命令的参数是一个可选的整数&#xff0c;用于指定退出状态。如果没有指定&#…