上一篇                     
               
			  Java如何捕获404异常?
- 后端开发
- 2025-06-22
- 3797
 在Java Web开发中捕获404异常,可通过以下方式实现:,1. 使用Spring框架时,通过
 
 
@ControllerAdvice配合
 @ExceptionHandler(NoHandlerFoundException.class)全局处理。,2. 在Servlet应用中配置web.xml的“标签指定404错误处理器。,3. 通过过滤器或拦截器检查响应状态码,对HttpServletResponse.SC_NOT_FOUND(404)进行拦截处理。
在Java Web应用中,404状态码表示客户端请求的资源不存在,作为开发者,捕获并优雅处理404异常能提升用户体验和系统可维护性,以下是几种主流实现方案:
Spring MVC 全局异常处理(推荐)
通过@ControllerAdvice和@ExceptionHandler实现:
@ControllerAdvice
public class GlobalExceptionHandler {
    // 捕获NoHandlerFoundException(需配合配置启用)
    @ExceptionHandler(NoHandlerFoundException.class)
    public ResponseEntity<Object> handle404(NoHandlerFoundException ex) {
        Map<String, Object> body = new LinkedHashMap<>();
        body.put("timestamp", LocalDateTime.now());
        body.put("message", "资源不存在");
        return new ResponseEntity<>(body, HttpStatus.NOT_FOUND);
    }
} 
关键配置(在application.properties中):

spring.mvc.throw-exception-if-no-handler-found=true spring.web.resources.add-mappings=false
Servlet容器级错误页面(传统Web项目)
在web.xml中定义错误页面:
<error-page>
    <error-code>404</error-code>
    <location>/error/404.html</location>
</error-page> 
创建对应的HTML文件:

<!-- /WEB-INF/views/error/404.html --> <h1>404 错误</h1> <p>您访问的页面不存在</p>
Spring Boot自定义ErrorController
实现ErrorController接口处理所有错误:
@RestController
public class CustomErrorController implements ErrorController {
    @RequestMapping("/error")
    public ResponseEntity<Map<String, Object>> handleError(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == 404) {
            return ResponseEntity.status(404)
                .body(Map.of("error", "Not Found", "path", request.getRequestURI()));
        }
        return ResponseEntity.status(500).body(Map.of("error", "Server Error"));
    }
} 
前端控制器兜底方案
在DispatcherServlet中配置默认处理器:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/**")
                .setStatusCode(HttpStatus.NOT_FOUND)
                .setViewName("forward:/error/404");
    }
} 
最佳实践建议
- 优先级选择: 
  - Spring Boot项目优先使用@ControllerAdvice
- 纯Servlet项目用web.xml配置
 
- Spring Boot项目优先使用
- 日志记录:在处理器中添加日志记录404请求路径
- 友好响应: 
  - REST API返回JSON格式错误信息
- 网页应用返回定制化HTML页面
 
- 重定向处理:避免将404重定向到首页(可能导致SEO问题)
注意事项:
- Tomcat默认跳过小于400字节的404响应(可通过
server.error.whitelabel.enabled=false关闭默认白页)- 确保静态资源路径配置正确,避免误报404
引用说明:
本文解决方案参考Oracle官方Servlet规范文档、Spring Framework 5.3.x异常处理文档及Spring Boot 2.7.x错误处理机制,关键配置项依据Spring官方GitHub示例代码验证。
 
  
			 
			 
			 
			 
			 
			