开发环境中的调试视图(IDEA)

        当程序员写完一个代码时必然要运行这个代码,但是一个没有异常的代码却未必满足我们的要求,因此就要求程序员对已经写好的代码进行调试操作。在之前,如果我们要看某一个程序是否满足我们的需求,一般情况下会对程序运行的结果进行打印,用以观察程序执行的结果是否满足设计需求。这种方法有两个很明显的弊端,一个是频繁对程序中的数据进行打印不仅增加了代码的冗杂程度,而且如果没有对打印的数据进行注释,那么就很难对不同的数据进行区分;其次,如果运行的结果并不符合设计需求,那么就需要我们按照程序运行的流程走遍整个程序,以此检查不符合需求的部分,倘若这个不满足需求的部分出现在循环结构中,那么这个工作量无疑是巨大的,单靠人脑跑遍整个循环结构明显不现实。为了处理这样的问题,在开发环境中提供了分析程序的手段——断点breakpoint。

        在IDEA中,我们通过在代码的左侧的行号后面单击左键添加断点,断点添加成功后会在行号后面出现一个红色的圆点,再次单击左键可以取消断点。在定义了断点之后,右键在弹出的窗口中选择Debug按钮或者单击右上角的虫子模样的按钮就可以对程序进行调试操作,程序会在定了断点的地方停下来,并显示出此时涉及的变量以及常量的当前值,如下图所示:

        当我们点击Debug按钮对程序进行调试以后,在IDEA界面上会跳出一个下图模样的窗口,这个窗口可以简单的分为三大块,分别是方法栈的浏览区域,操作区域一击变量值的观察区域。在方法栈的浏览区域中包括了线程以及在我们定义了断点时正在执行没有退出栈帧的方法,最上面一行表示线程,下面表示的是方法的栈帧,方法名后面的数字表明了程序执行的行号;在变量观察区注意到有一个this,this的后面跟了一个类的名称,点开这个this能后看到这个类中储存的常量以及变量的相关信息;左侧的操作区是对程序的执行或停止等进行操作,上侧的操作按钮涉及到的是程序调试的相关内容,分别代表了step over、step into、force step into、step out、run to cursor。

        第一个图标step over是单步调试,表示跳过该方法,即如果当前执行的是一个方法,那么会把这个方法当作一步执行完,不会进入这个方法的内部。第二个图标step into也是单步执行,表示进入自定义方法,即如果当前执行的是一个自定义方法,那么在按下这个按钮后吗,程序会进入这个自定义方法的内部,不过不会进入JDK内部的方法。比如我们对第一张图片中的程序进行修改,添加一个自定义方法go,并对其进行调用,仍然在第7行添加断点。程序如下所示:

package com.duandian.demo;public class DuanDianDemo {private int num = 10;public void run(int a ){num = a*num;System.out.println(num);go(num);}public void go(int b){System.out.println("DuanDianDemo.go");System.out.println("num="+b);}public static void main(String[] args) {DuanDianDemo duanDianDemo = new DuanDianDemo();duanDianDemo.run(3);}
}

        这时,如果我们点按step over图标,则会发现,当代码执行到go(num);这一行时,代码会将它当作一行普通代码执行,并不会进入方法内部,但如果我们点击的时step into按钮,那么程序执行到这一行时则会进入go方法的内部,如下图所示(注意区分执行完go(num)这行后光标所在的行的位置)。

 

        第三个图标是force step into,它表示的是强制进入方法内部,因此在按下这个按钮的时候,程序可以进入任何方法,包括JDK的内部方法。第四个图标是step out,表示跳出方法,当我们用单步调试对程序进行调试并且进入子方法内部时,如果按下step out 按钮,那么程序会自动执行完子方法剩余的部分,并且跳出子方法,即使是进入JDK内部的方法,也能通过这个操作进行退出。        

        最后一个图标是 run to cursor,它表示一直执行直到光标停止,如果用在普通程序中,一般就是将整个程序执行完成,而在循环结构中,点击依次就代表循环一次,比如我们在上上面的程序中添加循环结构,代码变为下面样子,这时先用单步调试让程序进入循环结构,然后按下run to cursor图标,调试结果如下面的三组图片所示,要注意对比图中数据的变化:

package com.duandian.demo;public class DuanDianDemo {private int num = 10;public void run(int a ){num = a*num;System.out.println(num);go(num);}public void go(int b){System.out.println("DuanDianDemo.go");System.out.println("num="+b);}public static void main(String[] args) {DuanDianDemo duanDianDemo = new DuanDianDemo();duanDianDemo.run(3);for (int i = 0; i < 3; i++) {System.out.println(i);}}
}

 

 

 

 

      

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

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

相关文章

Spring框架九大核心功能全面揭秘(一)

目录 资源管理 Java资源管理 1、来个Demo 2、原理 Spring资源管理 1、资源抽象 Resource WritableResource 2、资源加载 3、小结 环境 1、Environment 2、配置属性源PropertySource 3、SpringBoot是如何解析配置文件 类型转换 1、类型转换API …

Ubuntu+Systemd服务+实现开机自启

1.创建一个新的 systemd 服务文件 现在随便一个地方创建txt文档 如果想要启动sh脚本&#xff0c;就把下面的代码输入到txt文档中 [Unit] DescriptionRun Python script on specific executable run Afternetwork.target[Service] Typesimple ExecStart/home/tech/run_on_exe…

光接入网络的超宽带半导体光放大器

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 新颖的双有源层结构获得宽增益光谱&#xff0c;应用于多波单纤双向光放大 ----翻译Xiao Sun等人2016年撰写的文章&#xff0c;文中给出了宽光谱SOA的一种新颖的结构设计方法和仿真结果&#xff0c;但并未给…

社交媒体数据恢复:Instagram

Instagram数据恢复方法 在本文中&#xff0c;我们将详细介绍如何恢复在Instagram上删除的照片、消息和其他数据。请注意&#xff0c;这些方法可能适用于其他类型的社交媒体数据&#xff0c;但具体效果取决于数据的实际状态和存储设备的健康状况。 一、准备工作 在开始数据恢…

四川赢涟电子商务有限公司深耕抖音电商服务

在当今数字化、网络化高速发展的时代&#xff0c;电子商务行业异军突起&#xff0c;成为推动经济增长的重要力量。四川赢涟电子商务有限公司凭借其敏锐的市场洞察力和创新精神&#xff0c;专注于抖音电商服务&#xff0c;致力于为广大消费者提供便捷、高效、个性化的购物体验&a…

kafka启动报错(kafka.common.InconsistentClusterIdException)

文章目录 前言kafka启动报错(kafka.common.InconsistentClusterIdException)1. 查找日志2. 定位问题/解决 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不…

基于YOLOv8+Pyqt5火焰烟雾检测系统

1、YOLOv8的基本原理 YOLOv8是一种前沿的目标检测技术&#xff0c;它基于先前YOLO版本在目标检测任务上的成功&#xff0c;进一步提升了性能和灵活性。主要的创新点包括一个新的骨干网络、一个新的 Ancher-Free 检测头和一个新的损失函数&#xff0c;可以在从 CPU 到 GPU 的各…

Golang | Leetcode Golang题解之第47题全排列II

题目&#xff1a; 题解&#xff1a; func permuteUnique(nums []int) (ans [][]int) {sort.Ints(nums)n : len(nums)perm : []int{}vis : make([]bool, n)var backtrack func(int)backtrack func(idx int) {if idx n {ans append(ans, append([]int(nil), perm...))return}…

数据分析学习资源(未完)

1、PDF 数据分析自学攻略 增长黑客&#xff08;AARRR&#xff09; 量化思维

glib读写ini文件测试

函数简介 g_key_file_load_from_file g_key_file_load_from_file() 是 GLib 库中的一个函数&#xff0c;用于从指定的文件路径加载一个键值对文件&#xff08;通常是一个 .ini 风格的配置文件&#xff09;。这个函数是 GKeyFile 结构体相关API的一部分&#xff0c;GKeyFile 用…

C++面向对象程序设计 - 重载运算符进一步讨论

函数重载就是对一个已有的函数赋予新的含义&#xff0c;使之实现新的功能。因此一个函数名就可以用来代表不同功能的函数&#xff0c;也就是一名多用。运算符也可以重载&#xff0c;即运算符重载&#xff08;operator overloading&#xff09;。 一、非成员、非友元的重载运算…

STM32F103学习笔记 | 1.Keil5详细安装教程

Keil5详细安装教程 https://www.keil.com/download/product/

使用API有效率地管理Dynadot域名,自查账户信息

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

大型组织企业 怎么实现便捷高效的跨地区文件交换?

大型组织企业&#xff0c;尤其是银行、邮政、大型集团、跨国企业等&#xff0c;都会存在多个分支机构&#xff0c;会面临跨地区文件交换的场景和需求。 跨地区文件交换可能会遇到以下问题&#xff1a; 1、网络带宽限制&#xff1a;跨国或跨大陆传输时&#xff0c;网络带宽可能…

CC攻击频发,企业如何做好网络安全,该怎么防护能免遭CC攻击?

在当前网络现状下&#xff0c;随着信息技术的飞速发展&#xff0c;网络攻击手段也愈发多样化和复杂化。其中&#xff0c;CC攻击作为一种针对Web应用层的拒绝服务攻击&#xff0c;其危害日益凸显&#xff0c;对企业和个人造成了严重的威胁。下面我们就从多个角度详细分享关于CC攻…

LyricWikia, 一个让你玩物丧志的Python库

文章目录 LyricWikia: Python的歌词查找库背景LyricWikia是什么&#xff1f;安装简单的库函数使用方法场景示例搜索并显示歌词获取歌手的热门歌曲搜索并下载歌词 常见问题和解决方案总结 LyricWikia: Python的歌词查找库 背景 LyricWikia是一个用于查找和获取歌曲歌词的Python…

【项目实战】基于高并发服务器的搜索引擎

【项目实战】基于高并发服务器的搜索引擎 目录 【项目实战】基于高并发服务器的搜索引擎搜索引擎部分代码index.htmlindex.hpplog.hppparser.cc&#xff08;用于对网页的html文件切分且存储索引关系&#xff09;searcher.hpputil.hpphttp_server.cc&#xff08;用于启动服务器和…

【Linux的git操作】

Linux学习笔记---010 Linux的git操作1、什么是gitee2、git 准备工作2.1、查看是否安装了 git 版本工具2.2、安装 git 工具/更新成最新版本2.3、在gitee上创建远程仓库&#xff08;略&#xff09;2.4、提交file的初始化操作 3、git的“三板斧”3.1、add3.2、commit3.3、push3.4、…

Amazon云计算AWS之[2]弹性计算云EC2

文章目录 说明EC2基本架构Amazon机器映象&#xff08;AMI&#xff09;实例&#xff08;Instance&#xff09;弹性块存储&#xff08;EBS&#xff09; EC2关键技术地理区域和可用区域EC2通信机制弹性负载均衡监控服务自动缩放服务管理控制台 EC2安全及容错机制EC2弹性IP地址 说明…

Pyside6:多行按钮点击判断序号

在Pyside开发过程中会遇到这么个问题&#xff1a;当多个按钮在很多行中&#xff0c;需要在点击槽函数中确认按钮的行。 普通的按钮点击信号如下&#xff1a; clicked() 该信号并未有任何参数&#xff0c;无法得到有效的信息&#xff0c;那么如何完成点击哪个确定是哪个按钮呢…