Java——断点调试

news2024/9/27 12:15:31

一、断点调试简介

Java的断点调试是程序开发中非常重要的一个技术,它允许开发者在程序执行时暂停执行,以便检查变量的状态、观察程序的流程、并定位错误。

1、断点(Breakpoint):

在代码的某一行指定的暂停点。当程序执行到这个点时,会中断执行,允许开发者检查当前的运行状态。

在大多数的IDE中,断点的形式一般是下面这样:

这时如果我们进行调试,程序就会在断点这一行中断执行,直到我们进行下一步操作,这时我们就可以看到一些运行中的状态。

2、调试(Debug):

指的是在程序执行过程中检查和修正代码的过程。

二、断点调试

如果我们要进行断点调试,我们需要先设置断点,一般设置断点就是在代码行号的左侧单击左键,会出现一个红色圆点,表示已设置断点,在左键一下就可以取消断点。在我们想要程序暂时中断执行的地方设置断点,然后进行调试,我们可以左键源代码,然后在列表中就可以看到调试这一选项,

点击进入调试。然后代码就会执行到设置的第一个断点处,然后暂时中断在此。

1、逐行执行(F8)

执行当前行,如果有方法,不进入方法,接着执行下一行。对应的是图中的这个按钮,可以使用快捷键 F8。

2、逐语句执行(F7)

进入当前行的调用方法,进行逐语句调试。对应的是图中的这个按钮。

当我们调用的是 Java 中提供的一些方法,如果我们还想通过逐语句执行进入这些方法的话,可以使用强制进入,下图中的 Force Step Into :

也可以进行一些配置:

这样我们不需要强制进入就可以进入这些方法了。

3、跳出方法(Shift + F8)

当我们通过逐语句执行进入了一个方法,然后又不想接着逐行执行,就可以使用这个跳出方法,直接回到上一级调用。对应图中的这个按钮。

4、继续程序(Resume Program)(F9)

主要作用是让程序从当前的暂停状态继续执行,直到遇到下一个断点、程序结束或发生异常。我们可以使用这个功能直接从一个断点调到下一个断点。对应的是图中的这个按钮。

三、断点调试示例

1、查看对象的创建过程

对于对象的创建过程在我之前的文章《Java——构造器(构造方法)和 this》中有提到过,大概就是下面的这个流程:

我们对下面这段代码进行调试,演示对象的创建过程:

package com.pack1;

public class Test {
	public static void main(String[] args) {
		Person person = new Person("Alice", 18);
		
	}
}

class Person {
	private String name;
	private int age;
	
	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}
}

我们在下图中的位置设置断点,然后开始调试,

在开始调试后,我们使用强制进入,然后就会进入到一个方法中:

这个方法就是用来加载类信息的。

然后我们跳出这个方法,跳出之后,我们接着使用逐语句执行,然后就会进入构造器:

如果我们在构造器这里在使用逐语句执行,就会进入父类的默认构造器:

然后完成调用父类的默认构造器。然后跳出父类的默认构造器后,我们可以看到变量栏中的 this.name 和 this.age 都是已经经过了默认初始化和显式初始化,

下面就会进行构造器初始化,然后我们接着进行逐行执行,

构造器调用完毕,我们发现初始化就完成了:

2、查看动态绑定机制

我们对下面的代码进行调试查看动态绑定机制:

package com.pack1;

public class Test {
	public static void main(String[] args) {
		Base obj = new Sub();
		System.out.println(obj.foo());
	}
}

class Base {
	private int num = 10;

	public int foo() {
		return getNum() + 20;
	}

	public int getNum() {
		return num;
	}
}

class Sub extends Base {
	private int num = 20;

	@Override
	public int getNum() {
		return num;
	}
}

这里的运行结果是:

这是因为对于一般方法调用存在动态绑定机制,调用的是哪个方法取决于实际的调用这个方法的对象的类,这里实际对象是 Sub 子类,所以执行到 foo 方法中的 getNum 方法时,到底调用父类的 getNum 方法还是调用子类重写的 getNum 方法是由实际对象决定的,因为实际对象是 Sub 子类,所以会调用子类重写的 getNum 方法。

我们在合适的地方设置断点:

然后进行调试,首先逐语句执行,进入到 foo 方法中:

然后接着使用逐语句执行,就会跳入子类的 getNum 方法中:

可以发现这里就是调用了子类重写的 getNum 方法。

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

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

相关文章

个人旅游网(1)——数据库表详解

文章目录 一、数据库表详情1.1 tab_category 表1.2、tab_route 表1.3、tab_route_img 表1.4、tab_user 表1.5、tab_favorite 表1.6、tab_address 表1.7、tab_seller 表1.8、tab_order 表1.9、tab_orderItem 表 一、数据库表详情 该网站是一个旅游网站,为具有出游的需…

C程序设计(潭浩强教授版)精选程序题

目录 (一)顺序程序设计部分 (二)选择程序设计部分 (三)循环程序设计部分 (四)数组处理数据部分 (一)顺序程序设计部分 1. 使用getchar读入两个字符&#xf…

对比 PDAF、CDAF 和 LAAF 自动对焦技术

深入解析相位检测自动对焦(PDAF) 相位检测自动对焦(PDAF,Phase Detection Auto Focus)是一种高效的自动对焦技术,广泛应用于现代数码相机、无反相机和智能手机摄像头中。为了更好地理解 PDAF,我…

C++11中的lambda匿名函数

一、引言 C11中引入的lambda表达式(也称为匿名函数或lambda函数)提供了一种方便且灵活的方式来定义和使用小的匿名函数对象。这些lambda表达式在编写回调函数、操作容器的算法中、或者在需要快速定义和传递一个函数逻辑给另一个函数时特别有用。 二、基…

行得稳,跑得远,美团如何做到长期主义持续发力?

在今天这样一个充满不确定性的时代,最能确定的是什么呢?我们这一代人,有幸成为诸多历史性时刻的亲历者和见证者。在此背景下,越来越多的企业家和经营者开始关注回归经营的本质和实现稳健经营的问题。 企业的稳健经营贯穿于企业的…

联华证券-掌握尾盘买入法的多种策略与实用技巧

尾盘买入法的常见方法与具体技巧 尾盘买入法是指在股票交易日的尾盘时段(通常指收盘前的15-30分钟)进行买入操作的策略。由于尾盘时段能够反映市场全天的交易情况以及主力资金的意图,尾盘买入法在捕捉短线机会方面具有一定的优势。以下是尾盘…

Python编码—掌握Python与Kubernetes:构建高效微服务架构

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

涨粉20w!AI真人视频转动漫,太好涨粉了,3步学会AI视频转绘!

大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 这类视频,流量超大。从去年一直火到了现在。 前有…

dubbo:巧用dubbo的SPI机制实现各类定制功能(六)

文章目录 0. 引言1. dubbo SPI机制1.1 什么是SPI1.2 java的SPI机制1.3 dubbo的SPI机制1.4 dubbo的SPI使用 2. 基于SPI实现定制功能2.1 dubbo的上下文参数2.2 实现权限校验、参数日志等功能2.3 dubbo spi条件激活机制Activate 3. dubbo的SPI与java的SPI有什么区别4. 总结 0. 引言…

机器学习:词向量转换及代码实现

CountVectorizer 是 scikit-learn 库中的一个文本向量化工具,它将文本数据转换为词频特征矩阵。以下是 CountVectorizer 的算法原理和步骤: 原理 文本预处理: 分词:将文本分割成单词或短语(tokens)。小写化…

mysql配置与日常使用

mysql配置 1.从官网下载zip文件并解压,解压的路径中最好不要有中文 2.添加环境变量 这一步的作用是可以在任意文件夹下操作mysql指令 操作步骤:环境变量 ->用户变量Path -> 添加mysql的bin目录 V 3. 在mysql解压路径下添加配置文件my.ini …

力扣刷题第二阶段Days35(javascript)

1,题目描述 -- 和为K的子数组 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 2,代码详解 哈希+前缀和 /*** param {number[]} nums* param {number} k* ret…

【openwrt-21.02】T750 openwrt-21.02 Linux-5.4.238 input子系统----gpio-keys实现分析

input子系统 输入子系统是由设备驱动层(input driver)、输入核心层(input core)、输入事件处理层(input event handle)组成 input子系统架构图 gpio-keys gpio-keys是基于input子系统实现的一个通用按键驱动,该驱动也符合linux驱动实现模型,即driver和device分离模型.一…

MIT 6.5840(6.824) Lab 4:Fault-tolerant Key/Value Service 设计实现

1 实验要求 本实验旨在利用lab 3中的Raft库,构建一个具备容错能力的键值存储服务。服务将作为一个复制状态机,由多个服务器组成,各服务器通过Raft协议同步数据库状态。即使在部分故障或网络隔离的情况下,只要大多数服务器正常&am…

通过MindOpt APL建模求解组合优化问题中的常见问题:图着色问题

组合优化问题:图着色问题 通过MindOpt APL建模求解组合优化问题中的常见问题:图着色问题 1. 背景知识 1.1. 组合优化问题 在之前发布的《组合优化问题:装箱问题》中,我们讲解了什么是组合优化(Combinatorial Optimi…

【练习1】数字统计

题目: 分析: 枚举法数字拆分(tmp % 10,tmp / 10) 代码实现: public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int l in.nextInt(), r in.nextInt();…

【2024 CCF编程能力等级认证(GESP)Python 】一级大纲

目录 1. 背景2. 考核知识块3. 考核内容3.1 计算机基础知识3.2 编程规范3.3 基础语法3.4 数据类型3.5 三大基本结构3.6 运算符3.7 模块导入与输入输出3.8 Turtle绘图4. 考核目标5. 题型分布6. 考试时长7. 认证时间与报名8. 政策与福利9. GESP一级认证形式 1. 背景 官网&#xff…

11 对话模型微调

提问:其实我一直觉的数据是最费事的一个,现在都是使用别人的数据,如果对于实际场景中那么我们该如何获取处理数据呢! 1 数据处理; 2 模型选择,调参数; 数据 llm-wizard/alpaca-gpt4-data-zh …

简单的二叉树问题——二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:root [1,null,2] 输出…

【二叉树进阶】--- 前中后序遍历非递归

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 本篇博客我们将来了解有关二叉树前中后序遍历的非递归版本。 🏠 前序遍历 要迭代非递归实现二叉树的前序遍历,首先还…