热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于java:起飞会了这4个-Intellij-IDEA-调试魔法阅读源码都简单了

上一篇文章IntelliJIDEA高级调试之StreamTrace算是IntelliJIDEA高级调试技巧的开胃菜,小伙伴们被这个小技巧驯服,趁热打铁,明天给大家带来几个大家日常工作以及浏览源码必备的高级调试技巧

前言

上一篇文章 IntelliJ IDEA 高级调试之Stream Trace 算是 IntelliJ IDEA 高级调试技巧的开胃菜,小伙伴们被这个小技巧驯服,趁热打铁,明天给大家带来几个大家日常工作以及浏览源码必备的高级调试技巧

断点处增加 log

很多程序员在调试代码时都喜爱 print 一些内容,这样看起来更直观,print 完之后又很容易遗记删除掉这些没用的内容,最终将代码提交到 remotecode review 时又不得不删减这些内容从新提交,岂但减少不必要的工作量,还让 log tree 的一些节点没有任何价值

IntelliJ IDEA 提供 Evaluate and Log at Breakpoints 性能凑巧能够帮忙咱们解决这个问题, 来看上面代码:

public static void main(String[] args) {
        ThreadLocalRandom random = ThreadLocalRandom.current();
        int count = 0;
        for (int i = 0; i <5; i++) {
            if (isInterested(random.nextInt(10))) {
                count++;
            }
        }
        System.out.printf("Found %d interested values%n", count);
    }



    private static boolean isInterested(int i) {
        return i % 2 == 0;
    }

如果咱们想在第 15 行查看每次调用,随即进去的 i 的值到底是多少,咱们没必要在这个中央增加任何 log,在失常加断点的中央应用快捷键 Shift + 鼠标左键,就会弹出上面的内容

勾选上 Evaluate and log, 并自定义你想查看的 log/变量,比方这里的 "interested" + i, 这样以 Debug 模式运行程序(失常模式运行,不会打印这些 log):

interested 7
interested 5
interested 1
interested 2
interested 0
Found 2 interested values

如果你在多处增加了这种断点,简略的看 log 可能偶然还是不够直观,能够勾选下面图片绿色框线的 "Breakpoint hit" message :

Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 6
Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 0
Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 9
Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 8
Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 1
Found 3 interested values
Disconnected from the target VM, address: '127.0.0.1:0', transport: 'socket'

Process finished with exit code 

如果你想要更具体的信息,那就勾选上 Stack trace (大家本人查看运行后果吧),有了这个性能,下面说的一些问题都不复存在了

字段断点

如果你浏览源码,你肯定会有个困扰,类中的某个字段的值到底是在哪里扭转的,你要一点点追踪调用栈,逐渐排查,稍不留神,就可能有脱漏

咱们能够在 IntelliJ IDEA 中为某个字段增加断点,当字段值有批改时,主动跳到相应办法地位

应用起来很简略:

  1. 在字段定义处鼠标左键增加断点(会呈现「眼睛」的图标)
  2. 在「眼睛」图标上鼠标右键
  3. 在弹框中勾选上 Field accessField modification 两个选项

如果批改字段值的办法比拟多,也能够在 Condition 的中央定义断点进入条件, 有了这个性能的加成,置信你浏览源码会顺畅许多

异样断点

除了浏览源码,肯定是遇到了异样咱们才开始调试代码,代码在抛出异样之后会主动进行,然而咱们心愿:

代码停在抛出异样之前,不便咱们查看过后的变量信息

这时咱们就用到了 Exception Breakpoints, 当抛出异样时,在 catch 的中央打上断点,能够通过下图的几个地位获取栈顶异样类型,比方这里的 NumberFormatException

晓得异样类型后,就能够依照如下步骤增加异样断点了:

而后在弹框中抉择 NumberFormatException

从新以 Debug 模式运行程序:

程序「一路绿灯式」定位到抛出异样的地位,同时指出过后的变量信息,三个字:稳,准,狠,还有谁?

办法断点

当浏览源码时,比方 Spring,一个接口的办法可能被多个子类实现,当运行时,须要查看调用栈逐渐定位实现类,IDEA 同样反对在接口办法上增加断点(快捷键 cmd+F8/ctrl+F8):

  1. 鼠标左键在办法处点击断点(♦️形态)
  2. 断点上鼠标右键

勾选上绿色框线上的内容,同样能够自定义跳转条件 Condition

当以 Debug 模式运行程序的时候,会主动进入实现类的办法(留神断点形态):

看到这你应该想到常见的 Runnable 接口中的 run 办法了,同样是有作用的,大家能够自行去尝试了

总结

置信有以上四种调试技巧的加成,无论是工作debug 还是私下浏览源码,都能够轻松驾驭了。最初,来看看 IDEA 反对的各种断点调试类型,如果你只晓得红色小圆点,那咱在留言区好好说说吧

日拱一兵 | 原创


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
author-avatar
兴桂秀寧29
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有