Java中无标准“404异常”,需通过Spring Boot错误机制处理:1. 放置404.html至templates/error或static/error目录启用自动跳转;2. 实现ErrorController精细控制;3. SimpleMappingExceptionResolver仅适用于业务抛出的自定义异常;4. REST API场景需配置spring.mvc.throw-exception-if-no-handler-found=true并用@ExceptionHandler捕获NoHandlerFoundException返回JSON。

Java 中本身没有“404 异常”这个标准异常类,HTTP 404 是响应状态码,不是 Java 运行时抛出的异常。真正需要处理的是:当请求的资源(如 Controller 方法、静态资源、Thymeleaf 模板等)未匹配时,Spring Boot 默认返回白页或 JSON 错误,而你想捕获这种“找不到”的场景,返回自定义 HTML 页面(如 /error/404.html)或统一 JSON 响应。
1. 使用 Spring Boot 内置的错误页面机制(推荐,最简单)
Spring Boot 默认支持 /error 全局错误处理路径,并自动根据状态码匹配视图。你只需提供对应页面即可:
- 在
src/main/resources/templates/error/下创建404.html(使用 Thymeleaf) - 或在
src/main/resources/static/error/下创建404.html(纯静态页面) - 确保已启用模板引擎(如 thymeleaf)或静态资源支持
✅ 效果:所有未匹配的 GET 请求(如访问不存在的 /user/999 或 /abc)都会自动跳转到该页面,无需写 Java 代码。
2. 自定义 ErrorController(精细控制响应内容)
若需动态渲染、记录日志、或区分 API 与页面请求,可实现 ErrorController:
立即学习“Java免费学习笔记(深入)”;
@Controller
public class CustomErrorController implements ErrorController {
@RequestMapping("/error")
public String handleError(HttpServletRequest request, Model model) {
Integer statusCode = (Integer) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
if (statusCode != null && statusCode == 404) {
model.addAttribute("message", "抱歉,您访问的页面不存在");
return "error/404"; // 对应 templates/error/404.html
}
return "error/generic";
}
@Override
public String getErrorPath() {
return "/error";
}
}
⚠️ 注意:Spring Boot 2.3+ 推荐用 ErrorWebExceptionHandler 替代(见下一条),但此方式仍兼容且直观。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
3. 使用 WebMvcConfigurer + SimpleMappingExceptionResolver(旧版常用,不推荐新项目)
该方式主要用于捕获 Controller 抛出的异常(如手动 throw new NotFoundException()),不能捕获 404 路由未匹配。如果你在 Controller 中主动检测 ID 不存在并抛出自定义异常,才适用:
- 定义异常类:
public class ResourceNotFoundException extends RuntimeException - 在 Controller 中:if (user == null) throw new ResourceNotFoundException();
- 配置
SimpleMappingExceptionResolver将该异常映射到 404 页面
❌ 不适用于真正的“URL 找不到”,仅适用于业务逻辑中“资源查不到”。
4. 面向 REST API 的 JSON 404 响应(前后端分离场景)
如果项目是纯接口服务,应返回统一 JSON 格式而非 HTML 页面:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NoHandlerFoundException.class)
public ResponseEntity<ApiResponse> handle404(NoHandlerFoundException e) {
ApiResponse error = ApiResponse.fail("请求地址不存在", 404);
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
}
}
? 关键前提:在 application.properties 中开启未匹配路径抛异常:
spring.mvc.throw-exception-if-no-handler-found=true spring.web.resources.add-mappings=false
这样,访问不存在的接口路径才会触发 NoHandlerFoundException,进而被上述 Advice 捕获。
不复杂但容易忽略:404 是 HTTP 协议层概念,Java 层需靠 Spring 的路由机制和错误处理链来感知;直接 try-catch 是无效的,必须走框架约定的错误处理流程。

















