Intellij IDEA调试技巧的深入讲解

 更新时间:2019年08月01日 08:30:28   作者:good_andyxu  
这篇文章主要给大家介绍了关于Intellij IDEA调试技巧的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

程序员的日常工作除了写代码之外,很大一部分时间将会在查找 BUG,解决问题。查找 BUG,离不开在 IDE 中调试代码。熟练的掌握调试技巧,可以帮助我们减少查找时间,快速定位问题。

在 IDEA 中调试代码很方便,只要开启调试,在相应代码处使用断点,然后进行相应调试即可。正是因为只要掌握这几个功能,就可以调试代码,所以在很长一段时间内,不了解其他调试技巧。后续深入使用 IDEA 过程中,不断学会 IDEA 其他调试技巧,很大程度上加快调试速度。

Step 系列按钮

日常调试的过程中为了为了找到程序的bug,通常需要单步调试,一步一步跟踪程序执行的流程,根据变量的值,找到最终原因。

IDEA 中提供一系列 Step 功能按钮用于单步调试,可以在 Run 菜单栏找到全部 Step 功能。

另外在调试窗口也可以找到,不过这里只会显示一部分常用按钮。

调试过程中,使用频率最高的可能就是 Setp Over。Setp Over 可以单步调试代码,但是当碰到方法执行时,不会进入方法内,直接调用了方法,然后到下一行。

如果需要进入方法内,需要使用 Step Into 。Step Into 可以进入调用的方法内,不过默认情情况下并不会进入 java.* 等类的方法中。如果需要进入,可以在 Setting-Stepping 中设置,排除即可。。

另外还可以使用 Force Step Into,强制进入。

当碰到一行代码调用多个方法时,使用 Step Into 就比较蛋疼了。Step Into 会按照调用顺序进入调用的方法,但是往往我们只想进入其中一个方法而已。

这种场景下我们可以使用 Smart Step Into ,选择指定方法进入。

有些情况下,在进入一个方法后,可以使用 Setp Out,快速执行方法,然后跳回到调用处。

另外在进入 for/while 循环里面的后,如果不在循环代码外面打断点出来,就需一步步随着循坏代码执行结束,特别麻烦。在这里就可以使用 Setp Out Of Code Block,快速跳出循环代码块。

断点使用技巧

临时断点

一般调试的时候,我们会在代码行使用断点,然后运行测试,等到程序遇到断点暂停时,查看相关变量内容。

在 IDEA 中,默认断点将会一直存在。有时候仅仅想需要暂停第一次,临时查看,这个时候我们可以使用临时断点。使用快捷键 Ctel + Alt + Shift +F8 可以快速创建临时断点或者按住 ALt,然后再创建断点。。

条件断点

有时候我们在循环处理数据的过程中,可能只关心某个条件的数据,这种情况下我们使用条件断点。

右击断点,弹出设置断点属性的窗口,我们就可以在 condition 处设置条件。IDEA 会在满足这个条件时候,才会暂停程序。

另外设置的条件断点样式也会比较特殊,

多线程断点

在调试多线程的项目时候,如果在多个线程代码处打上了断点,调试的时候你会发现,只能串行的调试。

上面多线程程序,两个线程启动之后,程序也许会在 thread1暂停,也许会在 thread2处暂停。只要任一个断线暂停之后,另一处断点线程就会被阻塞。这时只能调试完暂停处线程的断点,才能跳到第二处断点,调试起来非常不方便。

我们可以设置断点线程属性,改变这个特性。

我们可以在断点上使用鼠标右键弹出断点设置框,在 Suspend 选择 Thread 选项。重新启动上面的程序,然后在调试窗口 Frames 可以看到 thread1,thread2两个线程。其中两个线程均可进入调试,此时程序调试位于 thread1 处。这时选择框选择thread2,就可以调试 thread2.

另外,断点的多线程属性可以设置默认属性,点击 Make Default 按钮,设置默认 Suspend属性。

回退调试程序

调试的时候,有时候会进错方法或者错过一个方法调用过程,这个时候往往只能重新开始从头开始执行调试一遍。从新开始调试,可能还需要设置相关参数,修改数据库状态等,非常麻烦。所以如果在调试过程中可以回退就可以不用重新开始。

IDEA 中可以使用 Drop Frame 与 Force Return 回退调试程序。

Drop Frame

Drop Frame 字面意思为丢栈。JVM 中使用栈帧用于进行方法调用数据结构,每次方法调用,对应着一个栈帧在虚拟机中从入栈到出栈的过程。调用方法之后,该方法栈帧将会位于栈顶。

执行 Drop Frame,丢弃栈顶栈帧,于是程序将会回到调用方法处。

调试上面的程序,在上面断点处,使用 Drop Frame,就可以跳回方法调用处,即第三行。查看输出窗口,发现并没有任何输出。

Drop Frame 可以在调试窗口栏找到。

注意与 Step Out 区别,执行 Step Out,方法将会执行结束之后再返回到调用处。

Force Return

Force Return 强制返回,可以在程序执行到一半时强制返回结束程序。可以在 Frames 找到。

点击 Force Return,可以设置返回值。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • SpringBoot基于数据库实现定时任务过程解析

    SpringBoot基于数据库实现定时任务过程解析

    这篇文章主要介绍了SpringBoot基于数据库实现定时任务过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 详解如何用Java实现对m3u8直播流抽帧

    详解如何用Java实现对m3u8直播流抽帧

    抽帧(frame extraction)是指从视频流中提取一些特定的帧,通常是关键帧或者随机帧,以供后续处理。这篇文章主要为大家介绍了如何用Java实现对m3u8直播流抽帧,需要的可以参考一下
    2023-03-03
  • Java实现PDF转HTML/Word/Excel/PPT/PNG的示例代码

    Java实现PDF转HTML/Word/Excel/PPT/PNG的示例代码

    这篇文章主要为大家介绍了如何利用Java语言是PDF转HTML、Word、Excel、PPT和PNG功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-05-05
  • Java Socket编程详解及示例代码

    Java Socket编程详解及示例代码

    本文主要讲解Java Socket编程,这里整理了详细的技术资料及简单的示例代码帮助大家学习参考,有需要的小伙伴可以参考下本文内容
    2016-09-09
  • Java并发编程之Semaphore详解

    Java并发编程之Semaphore详解

    这篇文章主要介绍了Java并发编程之Semaphore详解,Semaphore信号量可以用来控制同时访问特定资源的线程数量,常用于限流场景,Semaphore接收一个int整型值,表示 许可证数量,需要的朋友可以参考下
    2023-11-11
  • @FeignClient path属性路径前缀带路径变量时报错的解决

    @FeignClient path属性路径前缀带路径变量时报错的解决

    这篇文章主要介绍了@FeignClient path属性路径前缀带路径变量时报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Java ArrayList与LinkedList及HashMap容器的用法区别

    Java ArrayList与LinkedList及HashMap容器的用法区别

    这篇文章主要介绍了Java ArrayList与LinkedList及HashMap容器的用法区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-07-07
  • Java如何实现List自定义排序

    Java如何实现List自定义排序

    这篇文章主要介绍了Java如何实现List自定义排序,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-09-09
  • Mybatis-Plus中updateById方法不能更新空值问题解决

    Mybatis-Plus中updateById方法不能更新空值问题解决

    本文主要介绍了Mybatis-Plus中updateById方法不能更新空值问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • java 判断list是否为空过程解析

    java 判断list是否为空过程解析

    这篇文章主要介绍了java 判断list是否为空过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09

最新评论