IntelliJ IDEA调试技巧
IntelliJ IDEA高级调试技巧
假设我们在UserService
类的getUserAndCheckStatus
方法中遇到了难以追踪的问题。以下是在IntelliJ IDEA中进行高效调试的一些进阶技巧:
1. 条件断点(Conditional Breakpoint)
如果你知道问题只在特定条件下出现,可以设置条件断点。例如,我们只想在尝试获取的用户ID为某个特定值时中断执行。
- 右击已设置的断点 > Edit Breakpoint > 勾选"Condition",输入条件表达式,如
userId == 3
。
2. 数据观察(Watches)
在调试过程中,你可能需要监视某些变量或表达式的值。使用“Watches”窗口可以方便地跟踪它们的变化。
- 在调试模式下,右击变量 > Add to Watches,或直接在“Watches”窗口添加表达式。
3. 多线程调试
如果服务是多线程的,可以利用IntelliJ IDEA的多线程视图来跟踪不同线程的执行情况。
- 在调试工具栏,点击"Threads"图标,查看并切换到不同的线程堆栈。
4. 异常断点(Exception Breakpoint)
对于经常抛出异常的情况,可以设置异常断点来自动在异常抛出时中断。
- 在菜单栏选择"Run" > “View Breakpoints”,点击"+" > “Java Exception Breakpoint”,指定你想捕获的异常类型,如
Exception
。
5. 快速评估表达式(Evaluate Expression)
在调试会话中,可以即时评估任何有效的Java表达式,这对于理解当前上下文非常有用。
- 当程序暂停时,选择"Code"菜单 > “Evaluate Expression”,或在调试面板右击选择"Evaluate Expression",输入表达式并执行。
示例:调试getUserAndCheckStatus
方法
假设我们怀疑当用户为非活动状态时的异常处理逻辑有问题,我们可以通过以下步骤进行调试:
- 设置条件断点:在判断用户是否活跃的条件前设置一个条件断点,条件为
!user.isActive()
。 - 启动调试:使用"Debug ‘getUserAndCheckStatus()’"启动调试会话。
- 观察变量:在断点触发时,观察
user
对象的状态,确认其isActive
属性确实为false
。 - 步进执行:使用"Step Over"和"Step Into"按钮,逐步执行到异常抛出的地方,观察异常处理逻辑的执行路径。
- 评估表达式:在异常处理分支内,使用"Evaluate Expression"功能,手动修改
user.isActive()
的值为true
,看是否能正常通过检查,以此来验证逻辑的正确性。
通过这些高级调试技巧,我们能够更有效地定位和解决代码中的问题,确保服务逻辑的准确无误。
为了更好地演示IntelliJ IDEA中的高级调试技巧,让我们以具体的Java代码示例来说明如何应用这些技巧。我们将延续之前的UserService
示例,并重点展示如何设置条件断点、使用观察表达式、以及快速评估表达式。
Java代码示例:UserService.java
public class UserService {private UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User getUserAndCheckStatus(int userId) throws Exception {User user = userRepository.findById(userId); // 假设这里可能抛出异常if (user == null) {throw new Exception("User not found.");}if (!user.isActive()) { // 设置条件断点的理想位置throw new Exception("User is inactive.");}return user;}
}
在IntelliJ IDEA中应用调试技巧
1. 设置条件断点
- 首先,打开
UserServiceTest
中测试getUserAndCheckStatus
的测试方法,如testGetUserWhenInactive
。 - 点击行号旁边的空白区域,在
if (!user.isActive())
这一行设置断点。 - 右击设置的断点,选择"Edit Breakpoint",在弹出的对话框中勾选"Condition",输入条件表达式,如
userId == 3 && !user.isActive()
。这样,只有当查询的用户ID为3且用户不活跃时,才会触发断点。
2. 使用观察表达式(Watches)
- 开始调试会话,当程序在断点处暂停时,可以在"Variables"窗口看到当前作用域内的所有变量。
- 右击你感兴趣的变量,如
user
,选择"Add to Watches",或者直接在"Watches"窗口手动输入表达式,如user.isActive()
,来持续观察其值的变化。
3. 快速评估表达式(Evaluate Expression)
- 当调试器暂停在断点上时,选择菜单栏的"Code" > “Evaluate Expression”,或在调试面板右击选择"Evaluate Expression"。
- 在弹出的对话框中输入一个Java表达式,例如,如果你想验证改变
user.isActive()
的值对程序的影响,可以输入user.setActive(true)
然后点击"Evaluate"。注意,这仅在调试时修改变量的值,不会影响到实际代码执行。
注意事项
- 记得在调试完毕后清理不再需要的断点,以免影响后续的调试或运行。
- 实际使用中,根据具体需求灵活应用这些调试技巧,可以帮助你更高效地定位问题和理解代码逻辑。
通过上述步骤,你可以直观地感受到IntelliJ IDEA高级调试功能的强大,它们极大地提高了调试效率和准确性。
让我们继续通过具体的Java代码示例来展示如何在IntelliJ IDEA中使用多线程调试、设置异常断点,以及进行快速评估表达式。
4. 多线程调试示范
假设我们有一个简单的多线程示例,其中包含两个线程,分别执行不同的任务。
public class MultiThreadExample {public static void main(String[] args) {Thread thread1 = new Thread(() -> task("Thread 1"));Thread thread2 = new Thread(() -> task("Thread 2"));thread1.start();thread2.start();}private static void task(String threadName) {for (int i = 0; i < 10; i++) {System.out.println(threadName + ": " + i);try {Thread.sleep(100); // 模拟耗时操作,便于观察线程切换} catch (InterruptedException e) {e.printStackTrace();}}}
}
调试步骤:
- 在
task
方法内部设置断点,比如在打印语句处。 - 以调试模式运行
MultiThreadExample
类。 - 当程序在某个断点暂停时,点击调试工具栏上的"Threads"图标(通常显示为两个交错的线程)。
- 在弹出的"Threads"视图中,你会看到当前活动的所有线程。你可以选择任意线程作为当前调试的上下文,只需双击线程名即可切换。
- 利用"Resume"(继续执行)和"Step Over"/"Step Into"等按钮在选定的线程中进行调试。
5. 异常断点示范
考虑一个可能抛出NullPointerException
的简单场景:
public class ExceptionExample {public static void main(String[] args) {String testString = null;printLength(testString);}private static void printLength(String str) {System.out.println(str.length()); // 这里可能抛出NullPointerException}
}
设置异常断点:
- 在菜单栏选择"Run" > “View Breakpoints”,打开断点配置界面。
- 点击"+“,选择"Java Exception Breakpoint”。
- 在新出现的对话框中,你可以直接输入或选择异常类型,如
NullPointerException
。 - 保持其他选项默认(或根据需要调整),点击"OK"。
现在,当你运行或调试程序时,只要遇到NullPointerException
,程序就会自动在抛出异常的位置暂停。
6. 快速评估表达式示范
继续使用上面的ExceptionExample
,我们将在调试时修改变量的值来演示快速评估表达式。
调试步骤:
- 在
printLength(str)
调用前设置断点。 - 以调试模式启动程序,当程序暂停在断点时,右击变量
str
或直接在调试面板找到它,选择"Evaluate Expression"。 - 在弹出的对话框中,输入
str = "Hello"
然后点击"Evaluate"。 - 观察到
str
的值已变为"Hello"
,此时如果继续执行程序,将不会再抛出NullPointerException
。
这些示例和步骤展示了如何在多线程环境下进行有效调试、精确捕捉异常以及动态评估代码片段,这些都是IntelliJ IDEA强大调试功能的重要组成部分。
相关文章:
IntelliJ IDEA调试技巧
IntelliJ IDEA高级调试技巧 假设我们在UserService类的getUserAndCheckStatus方法中遇到了难以追踪的问题。以下是在IntelliJ IDEA中进行高效调试的一些进阶技巧: 1. 条件断点(Conditional Breakpoint) 如果你知道问题只在特定条件下出现&…...
NGINX_六 nginx 日志文件详解
六 nginx 日志文件详解 nginx 日志文件分为 **log_format** 和 **access_log** 两部分log_format 定义记录的格式,其语法格式为log_format 样式名称 样式详情配置文件中默认有log_format main $remote_addr - $remote_user [time_local] "req…...
第6章 工程项目融资 作业
第6章 工程项目融资 作业 一单选题(共2题,40分) (单选题) 项目资金结构不包括( )。 A.项目债务资金结构比例 B. 项目建设投资与工程项目总成本费用的比例 C. 项目资本金内部结构比例 D. 项目资本金与债务资金的比例 正…...
网站安全防护怎么做?
引言:在当今数字化的时代,网络安全已经成为个人、企业乃至整个社会的一项关键挑战。随着互联网的普及和信息技术的迅猛发展,我们的生活和工作方式日益依赖于各种互联网服务和数据交换。然而,这种依赖也带来了越来越多的安全威胁和…...
泵设备的监测控制和智慧运维
泵是一种输送流体或使流体增压的机械。它通过各种工作原理(如离心、柱塞等)将机械能转换为流体的动能或压力能,从而实现液体的输送、提升、循环等操作。 泵的一些具体应用场景: 1.智能水务:在城市供水管网中ÿ…...
【智能算法应用】基于混合粒子群-蚁群算法的多机器人多点送餐路径规划问题
目录 1.算法原理2.数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】粒子群算法(PSO)原理及实现 配餐顺序: 采用混合粒子群算法 || 路径规划: 采用蚁群算法 2.数学模型 餐厅送餐多机器人多点配送路径规划&…...
Java中的JVM调优技巧
Java中的JVM调优技巧 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! Java虚拟机(JVM)是Java应用程序的核心组件,负责将Jav…...
软件工程-第4章结构化编码和测试
软件的实现阶段:软件编码,单元测试和综合测试。 软件编码是对软件设计的进一步具体化,其任务是将设计表示变换成用程序设计语言编写的程序。 软件测试是软件质量保证的重要手段,要成功开发出高质量的软件产品,必须认…...
MMDetection 目标检测 —— 环境搭建和基础使用
参考文档 开始你的第一步 — MMDetection 3.3.0 文档 依赖 步骤 0. 下载并安装 Anaconda。 步骤 1. 创建并激活一个 conda 环境。(我选择的是python3.10) conda create --name openmmlab python3.8 -y conda activate openmmlab 步骤 2. 基于 PyTo…...
C# 实现draw一个简单的温度计
运行结果 概述: 代码分析 该控件主要包含以下几个部分: 属性定义: MinValue:最低温度值。 MaxValue:最高温度值。 CurrentValue:当前温度值。 构造函数: 设置了一些控件样式来提升绘制效果…...
解放双手,让流程自动化软件助你一臂之力
本文将介绍流程自动化软件/脚本/助手的用途,同时我也做个自我介绍: 🏆 技术专长:专注于自动化脚本、网站、小程序、软件、爬虫及数据采集的定制化开发,为客户提供全方位的数字化解决方案。 💼 行业经验&…...
邀请函 | 桥田智能出席AMTS展会 家族新成员正式发布
作为国际汽车制造技术与装备及材料专业展览会,AMTS将于2024年7月3-5日在上海新国际博览中心举行。本届展会以【向“新”而行 “智”领未来】为主题,聚焦汽车及新能源全产业链,围绕“车身工程、部件工程、新能源三电工程及未来汽车开发”等技…...
安卓开发使用proxyman监控真机
1、真机跟电脑连接到同个网络中 2、手机里面设置代理,代理地址为proxyman上面指示的地址。 3、一般情况下,电脑的对应的端口是没开放的。需要到防火墙里面新建规则。入站规则 选择端口输入上方端口号 这样就能监控到了...
ruoyi登录功能源码分析
Ruoyi登录功能源码分析 上一篇文章我们分析了一下若依登录验证码生成的代码,今天我们来分析一下登录功能的代码 1、发送登录请求 前端通过http://localhost/dev-api/login向后端发送登录请求并携带用户的登录表单 在后端中的com.ruoyi.web.controller.system包下…...
推动产业数字化转型,六个方面引领变革
从工业经济时代走向数字经济时代,世界经济发生着全方位、革命性的变化,产业数字化便是最显著的表现之一。当前,产业数字化不断深入发展,平台经济、工业互联网、智能制造等新业态、新模式不断涌现,成为了数字经济的重要…...
设施布置之车间布局优化SLP分析
一 物流分析(Flow Analysis) 的基本方法 1、当物料移动是工艺过程的主要部分时,物流分析就是工厂布置设计的核心工作,也是物料搬运分析的开始。 2、零部件物流是该部件在工厂内移动时所走过的路线, 物流分析不仅要考虑…...
帕金森的锻炼方式
帕金森病,这个看似陌生的名词,其实离我们并不遥远。它是一种常见的神经系统疾病,影响着许多中老年人的生活质量。虽然帕金森病目前尚无根治之法,但通过科学合理的日常锻炼,可以有效缓解病情,提高生活质量。…...
PyTorch(一)模型训练过程
PyTorch(一)模型训练过程 #c 总结 实践总结 该实践从「数据处理」开始到最后利用训练好的「模型」预测,感受到了整个模型的训练过程。其中也有部分知识点,例如定义神经网络,只是初步的模仿,有一个比较浅的…...
windows下cmd命令行模式中cd变换路径命令无效的解决办法
一,出现的情况 二,解决方法 当出现转换盘的时候打开 cmd 之后可能是无法生效的 ,因为在cmd 中转换盘首先需要用到换盘符 。 Solve1 : 先进行换盘 C: c: // 转换到 C盘 D: d: // 转化到 D盘 Solve2 : 直接进行强转 cd /dE:\ACM算法资源\XCP…...
收藏||电商数据采集流程||电商数据采集API接口
商务数据分析的流程 第一步:明确分析目的。首先要明确分析目的,并把分析目的分解成若干个不同的分析要点,然后梳理分析思路,最后搭建分析框架。 第二步:数据采集。主流电商API接口数据采集,一般可以通过数…...
修改源码,打patch包,线上环境不生效
1.首先看修改的源码文件是否正确 在node_modules中,找对应的包,然后查看包中package.json 的main和module。如果用require引入,则修改lib下面的组件,如果是import引入则修改es下面的文件 main 对应commonjs引入方式的程序入口文件…...
NUC980-OLED实现全中文字库的方法
1.背景 有一个产品,客户需要屏幕展示一些内容,要带一些中文,实现了OLED12864的驱动,但是它不带字库,现在要实现OLED全字库的显示 2.制作原始字库 下载软件pctolcd2002 设置 制作字库 打开原始文件 用软件自带的&…...
UEFI 启动原理及qemu 虚拟化中使用
UEFI 启动原理及qemu 虚拟化中使用 什么是BIOS?什么是 UEFI? 什么是BIOS? 计算机启动时会加载 BIOS,以初始化和测试硬件功能。它使用 POST 或 Power On Self Test 来确保硬件配置有效且工作正常,然后寻找存储引导设…...
35、正则表达式
一、正则表达式命令 正则表达式:匹配的是文本内容,linux的文本三剑客都是针对文本内容。 grep 过滤文本内容 sed 针对文本内容进行增删改查 awk 按行取列 文本三剑客----都是按照行进行匹配。 1.1、grep筛选: grep的作用就是…...
Ubuntu20.04中复现FoundationPose
Ubuntu20.04中复现FoundationPose 文章目录 Ubuntu20.04中复现FoundationPose1.安装cuda和cudnn2.下载相关资源3.环境配置4.运行model-based demo5.运行ycbv demoReference 🚀 非常重要的环境配置 🚀 ubuntu 20.04cuda 11.8.0cudnn v8.9.7python 3.9.19…...
【Qt快速入门(四)】- QLabel文本框的使用
目录 Qt快速入门(四)- QLabel文本框的使用QLabel文本框的使用QLabel的基本用法1. 创建和设置文本2. 动态设置文本 设置文本样式1.设置字体和颜色2.文本对齐方式3.富文本显示 显示图片QLabel的交互功能可点击标签 QLabel的高级特性1.缩放图片以适应标签大…...
用Python设置Excel工作表网格线的隐藏与显示
Excel表格界面的直观性很大程度上得益于表格中的网格线设计,这些线条帮助用户精确对齐数据,清晰划分单元格。网格线是Excel界面中默认显示的辅助线,用于辅助定位,与单元格边框不痛,不影响打印输出。然而,在…...
自回归模型胜过扩散模型:用于可扩展图像生成的 Llama
📜 文献卡 Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation作者: Peize Sun; Yi Jiang; Shoufa Chen; Shilong Zhang; Bingyue Peng; Ping Luo; Zehuan YuanDOI: 10.48550/arXiv.2406.06525摘要: We introduce LlamaGen, a new family …...
访问外网的安全保障——反向沙箱
反向沙箱作为一种网络安全技术,其核心理念在于通过构建一个隔离且受控的环境,来有效阻止潜在的网络威胁对真实系统的影响。在当今日益复杂的网络环境中,如何借助反向沙箱实现安全上网,已成为众多用户关注的焦点。 随着信息化的发…...
【绝对有用】C++ 字符串进行排序、vector增加内容 和 剔除值
在 C 中对字符串进行排序,可以使用标准库中的 std::sort 函数。std::sort 函数可以用于容器或范围内的元素排序,包括字符串中的字符。以下是一个简单的示例代码,展示了如何对字符串中的字符进行排序: #include <iostream> …...
微信公众号页面设计模板/百度推广优化是什么意思
打开Controller.java类,里面即是控件对象和事件处理方法。 写一个清除按钮的事件处理方法,如下: 其他按钮的事件处理方法类似。 所以计算器的所有事件处理方法代码如下: package sample;import javafx.event.ActionEvent; import…...
正规网站建设报价/seosem是什么职位
Android-管理Android手机桌面 没有接触手机编程之前,我就很好奇,那些主题背景和动态壁纸是如何做出来的,如何把图标放到手机桌面上,学习了关于管理Android手机桌面之后,我大致了解了这些内容,算是扫了一下…...
深圳小企业网站建设设计制作/专业做网站公司
缓冲区 该笔记适用于Ubuntu,在Windows或其它平台上可能会存在不同。 什么是缓冲? 缓冲区又称为缓存,它是内存空间的一部分,用来缓冲输入或输出的数据。 为什么要引入缓冲区呢? 比如我们从磁盘里取信息,…...
注册公司怎么查询/网站优化推广seo公司
目录 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样。 PagerAdapter 介绍ViwePager 缓存策略ViewPager 布局处理ViewPager 事件处理相关内容 目录 1.如何对 Android 应用进行性能分析 2.…...
独立做网站需要学习什么/推广普通话奋进新征程手抄报
现在手机市场上,标配应该就是6G运存了,虽然也有8G的影子,但是主流的还是4G运存和6G运存。如果我们买手机的时候怎么选?哪个更合适?我们来讲讲运存是啥,运行内存就是运算数据的芯片,越大可以运行…...
营销网站策划/制作链接的小程序
并行接口,称为并口。并行端口使用25针D型连接头。所谓“并行”是指通过并行线路同时传输8位数据,从而大大提高了数据传输速度,但是并行传输线路的长度受到限制,因为长度增加,干扰会增加,并且数据容易出错。…...