IDEA Debug 高阶技巧,老手都是这么玩的~~

1143cbff678d327df4c1bb903b84ec74.jpeg来源:juejin.cn/post/7308539123537592357

👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 /  每月赠书

新项目:仿小红书(微服务架构)正在更新中... , 全栈前后端分离博客项目 2.0 版本完结啦, 演示链接http://116.62.199.48/ 。全程手摸手,后端 + 前端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,直到项目上线。目前已更新了261小节,累计41w+字,讲解图:1806张,还在持续爆肝中.. 后续还会上新更多项目,目标是将Java领域典型的项目都整一波,如秒杀系统, 在线商城, IM即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,已有1400+小伙伴加入(早鸟价超低)

e9f2c64260c16c4e8f7ce82d324c7785.gif

  • 目录

  • 引言

  • Debug基础

  • 高阶技巧-条件断点

    • 条件断点应用场景

    • 如何添加条件断点

    • 条件断点对于阅读源码的帮助

  • 高阶技巧-计算器

    • 查看变量值

    • 修改变量值

    • 测试表达式

    • 执行方法调用:


目录

d9ea5cb346be83f8e31b49a57c300cde.jpeg

图片

引言

IntelliJ IDEA,由JetBrains(捷克共和国)开发的一款强大的Java集成开发环境(IDE),因其丰富的功能、智能的代码辅助以及用户友好的界面设计,在全球范围内广受Java开发者的喜爱,在国内,笔者遇到过不使用IDEA的Java程序员不超过三个。不仅限于Java,IntelliJ IDEA还支持多种其他编程语言和框架,如KotlinScalaGroovy以及Android开发等,这进一步扩大了其用户基础。其社区版是免费的,而专业版则提供了更为高级的功能。

Debug(调试)是软件开发中不可或缺的一个环节。它使开发者能够逐行执行代码,检查运行时的状态,包括变量值、内存占用、线程状态等,从而帮助开发者理解代码的实际行为,定位并修复错误。良好的调试工具可以显著提高问题解决的效率,减少猜测工作,帮助开发者构建更加稳定、高效的软件系统。


在本文中,我将向大家介绍及演示IDEA的高阶Debug技巧,包含但不限于:

  • 条件断点(Conditional breakpoint): 允许开发者设置特定条件,只有当这些条件满足时,程序才会在这些断点处暂停执行。这对于调试复杂的循环和分支逻辑尤其有用,因为它可以让你聚焦于特定的执行路径或案例。

  • 计算器(Evaluate Expression): 这个功能允许开发者在调试会话中计算表达式的值,不仅可以查看变量的当前值,还可以执行表达式,甚至调用方法。这对于验证假设和测试代码更改而无需重新启动整个调试会话非常有用。

Debug基础

写一段代码,开启调试:

cf5c19b1d62f7c88efdec4a833bce23d.jpeg

图片
操作WindowsMac(OS X)
进入下一步,如果当前行断点是一个方法,则不进入当前方法体内F8F8(Fn)
进入下一步,如果当前行断点是一个方法,则进入当前方法体内, 如果该方法体还有方法,则不会进入该内嵌的方法中F7F7(Fn)
智能步入,断点所在行上有多个方法调用,会弹出进入哪个方法Shift + F7⇧F7 (Fn)
智能跳出Shift + F8⇧F8 (Fn)
恢复程序运行,如果该断点下面代码还有断点则停在下一个断点上F9F9(Fn)
运行到光标处,如果光标前有其他断点会进入到该断点Alt + F9⌥F9(Fn)
计算表达式(可以更改变量值使其生效)Alt + F8⌥F8 (Fn)
切换断点(若光标当前行有断点则取消断点,没有则加上断点)Ctrl + F8⌘F8 (Fn)
查看断点信息Ctrl + Shift + F8⌘⇧F8 (Fn)

高阶技巧-条件断点

我们构造一个List<User>用来模拟从数据库查询出列表,第三个元素id=3中的age属性是null,我们在for循环中使用加法来触发Integer类型的拆箱来出发空指针异常。

public class IDEATest {
 public static void main(String[] args) {

  List<User> userList = new ArrayList<>(6);
  userList.add(new User(1, "Tom", 19));
  userList.add(new User(2, "Giles", 25));
  userList.add(new User(3, "Alex", null));
  userList.add(new User(4, "Ryan", 21));
  userList.add(new User(5, "DongGe", 19));
  userList.add(new User(6, "RUI", 21));

  userList.forEach(user -> {
   String name = user.getName();
   int futureAge = user.getAge() + 10;
   System.out.println(name + " 10年后" + futureAge + "岁");
  });
 }

}

@Data
@AllArgsConstructor
@NoArgsConstructor
class User {
 private Integer id;

 private String name;

 private Integer age;
}

65b868f0a9ee15e6c3122c197805ecde.jpeg

图片

可以看到IDEA提示了第25行代码报了错,我们定位到第25行代码内容:

5f4532107fd9101e5c83a72f3c2b1ad7.jpeg

图片

为了定位问题,我们在第25行打个断点:

85434b72ae1b906d5a32175dc8064d9b.jpeg

图片

null + 10

在Java中,null是一个字面量,用来表示没有任何对象与之关联的引用。而+操作符在Java中主要有两种用途:一是作为数学加法运算符,用于基本数据类型的数值相加;二是作为字符串连接运算符,用于将两个字符串拼接在一起。

当你尝试执行null + 10这样的表达式时,Java会尝试找到一个合适的操作符重载来处理这个表达式。由于null不是一个数值,所以不能直接进行数学加法。但是,如果参与+操作的任一操作数是一个字符串,Java会将另一个操作数转换为字符串,并执行字符串连接操作。

条件断点应用场景

为了定位到具体哪一条数据出了问题,我们需要按F9或点击箭头处按钮直到循环到错误数据,案例中共6条数据,即使最后一条数据错误,我们也只需要按五次即可发现问题数据,但是在正式/测试环境中,你无法确认从数据库中查询到多少条数据,假如是1000条,接下来很长一段时间你将被这个问题所困扰。显然我们应该拒绝这种没有效率、无意义、重复性的工作。

如何添加条件断点

鼠标移至红色断点处,使用右键:

c40747a333535def478317cbd9665260.jpeg

图片

e2213909c85758c9af42ff439fc4f4e9.jpeg

图片

Condition中添加判断条件,上文中出现的异常是NullPointerException,我们就判断循环中的user对象age变量为null的即可:

Objects.isNull(user.getAge())

点击Done,确认。

15c2934cda84be2285f0ac9bf0ac0817.jpeg

图片

重启Debug,我们可以看到循环出的第一条数据不再是列表的第一条,而是问题数据:

f412f9589124f149fd934a609ed5fe84.jpeg

图片

这样我们便可以很快的定位到错误数据,解决问题。

条件断点对于阅读源码的帮助

例如,我们在阅读Spring Framework源码时,条件断点可以帮助我们快速定位到正在目标Bean。

Spring Boot项目在启动时,会加载所有被标注的元数据,此时我们自定义了一个Bean的类型叫a,我们可以在BeanFactoryUtils对应的加载方法中添加条件断点,这样就可以更快的查看我们自定义的Bean的加载逻辑。

af437c72126af9eb3ef4eee08cbdcb9d.jpeg

图片

4b07315a1e3ac08518e6b6377c42bb70.jpeg

图片

高阶技巧-计算器

在2023新版IDEA中,可以通过以下步骤找到计算器,或者通过快捷键的方式找到计算器。

babc7dfd8dcaf3f6292f12e38f886f74.jpeg

图片

06e359bae6db5c1281f526a2b006a2b7.jpeg

图片

查看变量值

在断点暂停时,你可以使用计算器来查看和评估变量的当前值,这比在变量监视窗口中查找要快得多。

4c7f34267cbbc43dc5d7c5de56c408e9.jpeg

图片

修改变量值

修改变量值:如果你想要测试代码对于不同变量值的反应,可以使用计算器改变变量的值,而无需修改代码并重新启动调试过程。

be040db49fe6e621f82895749e2399ac.jpeg

图片

1a4135f0ee2099e3c88fb3575692fdb5.jpeg

图片

测试表达式

如果你在编写代码时不确定某个表达式的结果,可以使用计算器快速进行测试,而不必写额外的测试代码或者等待代码运行到那一点。

4a52a8f2ef2b2e12098ae4f96cc414b7.jpeg

图片

执行方法调用:

通过计算器,你可以在不影响当前程序执行状态的情况下执行方法,这样可以帮助你理解方法的行为或者验证方法的返回值。

6a274e2bb0f276dfe2d0c2764feac484.jpeg

图片

👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 /  每月赠书

新项目:仿小红书(微服务架构)正在更新中... , 全栈前后端分离博客项目 2.0 版本完结啦, 演示链接http://116.62.199.48/ 。全程手摸手,后端 + 前端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,直到项目上线。目前已更新了261小节,累计41w+字,讲解图:1806张,还在持续爆肝中.. 后续还会上新更多项目,目标是将Java领域典型的项目都整一波,如秒杀系统, 在线商城, IM即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,已有1400+小伙伴加入(早鸟价超低)

c6c34ad58617f9efee5286a82418ec18.gif

be5dd44e55d7ce228d68d1cdb301015a.jpeg

 
 

e459ed7c47765d54aab40b94662f653f.gif

 
 
 
 
1. 我的私密学习小圈子~
2. 面试官:在项目中用过责任链模式吗?
3. 流程引擎的架构设计方案全解
4. MySQL 用 limit 为什么会影响性能?有什么优化方案?
 
 
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。
PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。
点“在看”支持小哈呀,谢谢啦
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
idea debug高级技巧有很多,以下是一些常用的技巧: 1. 使用断点:在代码中设置断点可以暂停程序的执行,以便查看变量的值和代码的执行流程。可以通过在设置中勾选"Show debug window on breakpoint"来自动激活Debug窗口。\[2\] 2. 多线程调试:在多线程程序中,可以使用调试器来跟踪每个线程的执行情况,以便发现并解决并发问题。\[3\] 3. 条件断点:可以在设置断点时设置条件,只有满足条件时才会触发断点。这对于调试特定情况下的代码非常有用。\[3\] 4. 显示方法返回值:在调试过程中,可以查看方法的返回值,以便验证方法的正确性。\[3\] 5. 动态修改变量的值:在调试过程中,可以修改变量的值,以便测试不同的情况和路径。这对于调试复杂的逻辑非常有用。\[3\] 6. 调试内存泄漏:可以使用调试器来跟踪对象的创建和销毁,以便发现并解决内存泄漏问题。\[3\] 这些是一些常用的idea debug高级技巧,希望对你有帮助。 #### 引用[.reference_title] - *1* *2* [【IDEAIDEA的高级Debug技巧](https://blog.csdn.net/qq877728715/article/details/104796755)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [idea debug高级特性看这篇就够了](https://blog.csdn.net/pony_maggie/article/details/99604039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值