HoRain云--Java异常处理最佳实践与性能优化 异常处理看似简单实则暗藏玄机。异常影响性能吗该捕获还是抛出finally一定会执行吗本文系统讲解Java异常处理。一、异常体系text复制下载Throwable ├── Error不可恢复 │ ├── OutOfMemoryError │ └── StackOverflowError └── Exception ├── RuntimeException非受检 │ ├── NullPointerException │ └── IllegalArgumentException └── 受检异常 ├── IOException └── SQLException二、受检 vs 非受检受检异常必须处理或声明用于可恢复场景非受检异常编程错误如NPEjava复制下载// 受检异常 public void read() throws IOException { Files.readAllBytes(Path.of(file.txt)); } // 非受检 public void validate(String s) { if (s null) throw new IllegalArgumentException(不能为null); }三、异常的性能创建异常需要填充栈轨迹开销较大。java复制下载// 慢用异常控制流程 try { while (true) { arr[index] getValue(); } } catch (ArrayIndexOutOfBoundsException e) { // 结束 } // 快正常判断 while (index arr.length) { arr[index] getValue(); }优化重写fillInStackTrace避免填充栈。java复制下载public class LightException extends RuntimeException { Override public synchronized Throwable fillInStackTrace() { return this; } }四、try-catch-finallyjava复制下载public int test() { try { return 1; } finally { return 2; // 覆盖try的return不推荐 } } // 返回2finally不执行的情况System.exit()JVM崩溃死循环五、try-with-resourcesjava复制下载// 旧方式 BufferedReader br null; try { br new BufferedReader(new FileReader(file.txt)); return br.readLine(); } finally { if (br ! null) br.close(); } // 新方式 try (BufferedReader br new BufferedReader(new FileReader(file.txt))) { return br.readLine(); }自定义资源需实现AutoCloseablejava复制下载public class MyResource implements AutoCloseable { Override public void close() { System.out.println(关闭资源); } }六、异常链保留原始异常信息java复制下载try { // ... } catch (SQLException e) { throw new ServiceException(查询失败, e); }java复制下载public class ServiceException extends RuntimeException { public ServiceException(String msg, Throwable cause) { super(msg, cause); } }七、异常处理反模式7.1 吞掉异常java复制下载// 坏 try { doSomething(); } catch (Exception e) { // 什么都不做 } // 好 try { doSomething(); } catch (Exception e) { log.error(操作失败, e); throw new ServiceException(操作失败, e); }7.2 捕获过宽java复制下载// 坏 try { // ... } catch (Exception e) {} // 好 try { // ... } catch (IOException e) { // 处理I/O异常 } catch (SQLException e) { // 处理数据库异常 }7.3 用异常控制流程java复制下载// 坏 try { return map.get(key).getValue(); } catch (NullPointerException e) { return defaultValue; } // 好 Value v map.get(key); return v ! null ? v.getValue() : defaultValue;八、全局异常处理Spring Boot中java复制下载RestControllerAdvice public class GlobalExceptionHandler { ExceptionHandler(BusinessException.class) public ResultVoid handleBusiness(BusinessException e) { return Result.error(e.getCode(), e.getMessage()); } ExceptionHandler(MethodArgumentNotValidException.class) public ResultVoid handleValidation(MethodArgumentNotValidException e) { String msg e.getBindingResult().getFieldErrors().stream() .map(FieldError::getDefaultMessage) .collect(Collectors.joining(, )); return Result.error(400, msg); } ExceptionHandler(Exception.class) public ResultVoid handleUnknown(Exception e) { log.error(未知异常, e); return Result.error(500, 系统繁忙); } }九、最佳实践不要吞异常至少记录日志捕获具体异常不要catch Exception用异常链保留原因不要用异常控制流程受检异常用于可恢复场景资源用try-with-resources自定义异常继承RuntimeException异常信息要具体包含关键参数十、总结异常处理的核心是不吞、不滥用、保留上下文。合理的异常设计能提升系统可维护性和可观测性。