1. 调试模式下 Java 异常断点的选取
1.1 什么是 Java 异常断点?
在调试模式下,IntelliJ IDEA 提供了 Java 异常断点 功能,用于在程序抛出特定异常类型时,自动暂停程序运行并定位异常抛出的代码位置。
1.2 Java异常断点的分类
- 捕获异常(Caught Exceptions): 如果异常被程序内部(如
try-catch
块或框架机制)捕获并处理,调试器仍会暂停程序运行并显示异常抛出的位置。 - 未捕获异常(Uncaught Exceptions): 如果异常未被捕获并冒泡到主线程,调试器会暂停程序运行,显示异常未处理的代码位置。
1.3 推荐配置
在调试模式下,为了避免调试器频繁中断在框架内部处理的异常上:
- 取消勾选 捕获异常(Caught Exceptions),保留 未捕获异常(Uncaught Exceptions)。
- 这样可以专注于实际可能影响程序运行的异常,而忽略框架内部正常的异常处理逻辑。
2. Spring Boot DevTools 的 SilentExitException
2.1 什么是SilentExitException?
SilentExitException
是 Spring Boot DevTools 提供的一个内部异常,用于实现 热部署(Hot Restart)。
它的作用是:
- 终止当前线程: 当 Spring Boot 检测到代码或资源文件发生更改时,会抛出
SilentExitException
,强制结束当前应用的线程。 - 启动新线程: Spring Boot DevTools 的内部机制会捕获该异常,并启动一个新的线程,重新加载应用程序的类和配置。
- 清理资源: 抛出
SilentExitException
后,旧的类加载器会被释放,以节省内存资源。
2.2 为什么抛出 SilentExitException?
- Spring Boot DevTools 为了实现 热部署功能,需要动态重新加载类和配置文件。
- 直接退出线程(例如
System.exit
)可能会完全终止 JVM,这显然不可行。因此,Spring Boot 通过抛出SilentExitException
实现线程退出,同时由 DevTools 捕获异常并启动新的加载逻辑。
2.3 为什么调试器会暂停在 SilentExitException 上(只勾选未捕获异常)
- 调试工具(如 IntelliJ IDEA)会暂停程序运行,显示
SilentExitException
抛出的代码位置。 SilentExitException
只在开发环境中触发,用于控制热部署流程。异常抛出后会被 Spring Boot 内部捕获,并不会导致程序中断。- 即使 Spring Boot 已捕获并处理该异常,调试器仍会识别为 未捕获异常,并误导开发者认为这是程序运行中的错误。
3. Spring Boot DevTools 的核心功能
只在开发环境下使用
spring-boot-devtools
是 Spring Boot 提供的一组开发工具,用于提升开发效率。它通常只在开发环境中使用。
spring-boot-devtools
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<optional>true</optional>
标志告诉 Maven:
- 该依赖只在本地开发中使用,不会传递到依赖它的其他模块(即不会作为传递性依赖)。
- 例如,如果你的项目被其他项目依赖,这些项目不会自动继承
spring-boot-devtools
。
核心功能
-
热部署(Hot Restart)
- 检测代码或配置文件的更改后,自动重启应用程序。
- 通过抛出
SilentExitException
来退出旧的应用线程,并启动新线程。
-
禁用模板缓存
- 禁用静态资源(如 HTML、CSS)和模板引擎的缓存,使修改内容能够立即生效。
-
LiveReload 支持
- 自动刷新浏览器页面,显示修改后的内容。
-
远程调试支持
- 提供远程调试的能力,用于开发环境中的特定场景。