HoRain云--Java异常处理最佳实践与性能优化

发布时间:2026/10/14 14:15:44
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异常信息要具体包含关键参数十、总结异常处理的核心是不吞、不滥用、保留上下文。合理的异常设计能提升系统可维护性和可观测性。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询