Java异常处理, 表面上瞧着挺简单, 却老是写得乱糟糟毫无条理, 或者try-catch层层堆叠, 或者把异常给咽下, 面试的时候还常常被问道最好的实践今儿个整理出5个实用性极强的办法, 新手照着做就能将代码处理得规范。① 背景/问题引入编写Java代码之际, 异常处理在各个地方都存在, 像是进行IO操作时, 在数据库调用过程中, 以及接口请求的时候, 均要对异常予以处理。对于新手而言, 极易犯下的错误存在两种情形, 其一为, 忽略异常状况而不加以处理, 进而致使程序走向崩溃其二是, 胡乱捕捉异常, 以至于在排查问题阶段毫无头绪, 难以着手, 而若能掌握最佳实践方法, 那么不但能够减少程序之中的漏洞, 而且还能够从容轻松地应对面试。② 核心原理讲解1. 只对具体异常进行捕获, 而不捕获通用异常比如, 原因在于, 通用异常会将所有错误都捕获, 其中涵盖了不需要处理的异常, 在后期进行排查时, 无法确定具体问题所在, 并且还可能会将严重错误掩盖。2. 不可吞掉异常, 不可让catch为空。缘由在于, 若catch为空会将异常吞掉, 程序表面看似正常运行, 然而实际上却潜藏着隐患, 在排查时无法找到问题的根源, 至少应当打印异常日志。3. 尽量优先采用try-with-自动关闭资源这种方式, 缘由在于, 若手动去关闭IO、流以及数据库连接, 极容易出现遗漏情况, 进而致使资源泄露, 而try-with-能够实现自动关闭, 既简洁又具备安全性。4. 自定义异常契合业务, 不随意过度使用。缘由在于, Java内置异常没办法对业务场景予以描述像是“用户不存在”这种情况, 而自定义异常能够使异常信息变得更为直观, 有助于排查业务方面的问题。5. 异常信息得具体, 不能模糊, 为啥呢? 因为模糊的异常信息, 像那种“发生异常”这样的表述, 没法准确定位问题所在, 必须要涵盖关键信息, 诸如参数、场景等, 这样才便于快速去排查。③ 关键代码示例### 1. 正确捕获具体异常不捕通用异常 try { // 数据库操作 Connection conn DriverManager.getConnection(url, user, pwd); } catch (SQLException e) { // 只捕具体异常SQLException // 异常信息具体包含关键场景 log.error(数据库连接失败url:{}原因:{}, url, e.getMessage(), e); } ### 2. 错误空catch吞异常禁止这么写 // try { // conn.close(); // } catch (SQLException e) { // // 空catch异常被吞无法排查 // } ### 3. 正确try-with-resources自动关闭资源推荐 try (InputStream is new FileInputStream(test.txt); OutputStream os new FileOutputStream(output.txt)) { // 操作流无需手动关闭自动释放资源 byte[] buf new byte[1024]; int len; while ((len is.read(buf)) ! -1) { os.write(buf, 0, len); } } catch (IOException e) { log.error(文件读写异常原因:{}, e.getMessage(), e); } ### 4. 正确自定义业务异常 // 自定义异常贴合业务 public class UserNotFoundException extends RuntimeException { // 带参构造传递具体异常信息 public UserNotFoundException(String message) { super(message); } } // 业务中使用 public User getUserById(Long id) { User user userMapper.selectById(id); if (user null) { // 异常信息具体直观反映业务问题 throw new UserNotFoundException(用户不存在用户ID: id); } return user; }拥有清晰注释的代码, 其正确与错误的写法都被特意精准一一标注, 新手能够直截了当地对最佳实践的应用场景进行直观理解, 可直接复制到项目里使用。④ 常见误区/易混淆点误区1为, catch( e)采取一把抓的方式, 认为“只要捕获所有异常便安全”。实际上, 会捕获那些等不需要手动去处理的异常, 进而掩盖代码逻辑方面的问题, 在进行排查时会变得极其困难。误区2: 当手动去关闭资源之际, 将close()书写于try之中。一旦try当中出现了异常情况, close()便不会得以执行, 进而致使资源出现泄露现象,所以必须采用try - with - 或者此方式不被推荐。⑤ 总结一句话记忆特定的捕获, 不进行吞掉异常的操作, 自动关闭资源, 进行自定义设置, 异常信息需要具体明确, 按照规范开展处理从而不踩到坑。