Debug

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;}@Overridepublic 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.hqwc.cn/news/291885.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Date对象】js中的日期类型Date对象的使用详情

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript小贴士 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续…

【Spring Security】打造安全无忧的Web应用--进阶篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Spring Security的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.导入相关配置 1.pom 2.ym…

Python: 函数参数是值传递还是引用传递

是引用传递。 Python的设计哲学是一切皆对象&#xff0c;不仅体现在内置数据类型、数据结构是对象&#xff0c;还包括Python编译运行需要的一些设施&#xff0c;比如stackframe、traceback等等。所以&#xff0c;为了更方便的传递数据&#xff0c;cpython内部全部采用指针传递…

Hadoop 集群环境搭建

目录 第一部分&#xff1a;系统安装... 3 1&#xff1a;图形化安装... 3 2&#xff1a;选择中文... 3 3&#xff1a;安装选项... 3 4&#xff1a;软件选项... 4 5&#xff1a;安装位置... 4 6&#xff1a;网络配置... 6 7&#xff1a;开始安装... 7 8&#xff1a;创建用户... 7…

【动态规划】09路径问题_最小路径和_C++(medium)

题目链接&#xff1a;leetcode最小路径和 目录 题目解析&#xff1a; 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析&#xff1a; 题目让我们求从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小 由题可得&#x…

CUMT--Java复习--泛型与集合

目录 一、泛型 1、概述 2、通配符 3、有界类型 二、集合 1、概述 2、迭代器接口 三、集合类 1、Collection接口 2、List接口 3、Set接口 4、Queue接口 5、Map接口 四、集合转换 五、集合工具类 一、泛型 1、概述 从JDK5.0开始&#xff0c;Java引入泛型类型&…

【51单片机系列】C51中的中断系统扩展实验

本文是关于51单片机中断系统的扩展实验。 文章目录 一、 扩展实验一&#xff1a;使用外部中断0控制蜂鸣器&#xff0c;外部中断1控制直流电机二、扩展实验二&#xff1a;修改定时器初值&#xff0c;设定3秒钟的定时时间让LED模块闪烁三、扩展实验三&#xff1a;使用定时器1和数…

在RT-Thread中使用SystemView进行调试分析

一、SystemView SystemView is a toolkit for visual analysis of any embedded system. SystemView gives complete insight into an application, to gain a deep understanding of the runtime behavior, going far beyond what a debugger is offering. This is particula…

redis基本用法学习(C#调用NRedisStack操作redis)

redis官网文档中推荐C#中使用NRedisStack包连接并操作redis&#xff0c;本文学习C#调用NRedisStack操作redis的基本方式。   新建Winform项目&#xff0c;在Nuget包管理器中搜索并安装NRedisStack包&#xff0c;如下图所示&#xff1a; 主要调用StackExchange.Redis命名空间下…

STM32微控制器在热电偶传感器应用中的性能评估

热电偶传感器是一种常用的温度测量技术&#xff0c;广泛应用于工业和自动化领域。在本文中&#xff0c;我们将探讨STM32微控制器在热电偶传感器应用中的性能评估。我们将涵盖STM32的特性、热电偶传感器的原理、硬件连接、软件编程以及性能评估的方法和指标。 STM32微控制器的特…

如何在Portainer部署一个web站点到Nginx容器并结合内网穿透远程访问

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

Spring Boot集成RocketMQ之消息对象序列化

以下源码基于rocketmq-spring-boot-start 2.1.1版本&#xff0c;其它版本可能会有差异 一. 前言 当我们在Spring Boot项目中集成RocketMQ后&#xff0c;只需要在配置文件(application.yml)中添加rocketmq的相关配置&#xff0c;即可使用rocketMQTemplate发送对象消息。登录Ro…