@SneakyThrows不合理使用,是真的坑

ops/2024/10/22 9:05:42/
public static void main(String[] args) {int a =1;int b = 2;String result = getResult(a, b);System.out.println(result);}@SneakyThrowspublic static String getResult(Integer a,Integer b){if (a.equals(b)){return "成功!";}else{throw new InterruptedException("失败!");}}

报错了

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/maven/jp_maven/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/maven/jp_maven/org/slf4j/slf4j-simple/1.7.32/slf4j-simple-1.7.32.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
Exception in thread "main" java.lang.InterruptedException: 失败!at com.juepeiscm.express.controller.openapi.TrackRePushOpenController.getResult(TrackRePushOpenController.java:87)at com.juepeiscm.express.controller.openapi.TrackRePushOpenController.main(TrackRePushOpenController.java:78)

> 1. 安全性和异常处理

问题: @SneakyThrows
注解虽然可以简化异常处理,但它隐藏了异常处理的细节,可能会导致潜在的错误被忽略。此外,InterruptedException
是一个受检异常,通常用于线程中断,这里使用它可能不合适。

建议: 使用更合适的异常类型,并显式地处理异常。

修改后的代码:

  public static void main(String[] args) {int a = 1;int b = 2;try {String result = getResult(a, b);System.out.println(result);} catch (Exception e) {System.err.println("发生错误: " + e.getMessage());}}public static String getResult(Integer a, Integer b) {if (a.equals(b)) {return "成功!";} else {throw new IllegalArgumentException("失败!");}}

2. 逻辑Bug

问题: a.equals(b) 可能会导致空指针异常,如果 a 或 b 为 null。

建议: 在调用 equals 方法之前,先检查 a 和 b 是否为 null。

修改后的代码:

  public static void main(String[] args) {int a = 1;int b = 2;try {String result = getResult(a, b);System.out.println(result);} catch (Exception e) {System.err.println("发生错误: " + e.getMessage());}}public static String getResult(Integer a, Integer b) {if (a == null || b == null) {throw new IllegalArgumentException("参数不能为空");}if (a.equals(b)) {return "成功!";} else {throw new IllegalArgumentException("失败!");}}

3. 性能效率

问题: 使用 Integer 类型的 equals 方法进行比较,虽然在大多数情况下性能影响不大,但使用基本类型 int 的比较会更高效。
建议: 将 Integer 类型的参数改为 int 类型。

修改后的代码:

  public static void main(String[] args) {int a = 1;int b = 2;try {String result = getResult(a, b);System.out.println(result);} catch (Exception e) {System.err.println("发生错误: " + e.getMessage());}}public static String getResult(int a, int b) {if (a == b) {return "成功!";} else {throw new IllegalArgumentException("失败!");}}

4. 可维护性

问题: 代码中的异常信息和返回值都是硬编码的字符串,这可能会导致维护困难。

建议: 使用常量来定义这些字符串,以便于管理和修改。

修改后的代码:

  public static final String SUCCESS_MESSAGE = "成功!";public static final String FAILURE_MESSAGE = "失败!";public static void main(String[] args) {int a = 1;int b = 2;try {String result = getResult(a, b);System.out.println(result);} catch (Exception e) {System.err.println("发生错误: " + e.getMessage());}}public static String getResult(int a, int b) {if (a == b) {return SUCCESS_MESSAGE;} else {throw new IllegalArgumentException(FAILURE_MESSAGE);}}

**

总结

**

通过上述优化,代码在安全性、异常处理、逻辑Bug、性能效率和可维护性方面都得到了改进。希望这些建议对你有帮助

注意事项

避免不必要的使用:虽然 @SneakyThrows 可以减少样板代码,但不应过度使用,尤其是在公共 API
或库中。因为它隐藏了异常处理,使得调用者可能无法准确预知可能发生的异常。

错误处理:使用 @SneakyThrows 后,任何异常会在运行时被抛出,可能导致应用程序崩溃。要确保在合适的地方处理这些异常。

调试困难:因为异常被隐式抛出,可能会导致调试时跟踪异常来源变得困难。

类加载:@SneakyThrows 处理的是受检查异常(如 IOException),对于非受检查异常(如
NullPointerException),它不会起作用。

总结

@SneakyThrows
是一个方便的工具,可以减少代码的复杂性,但需要谨慎使用,以免影响代码的可读性和维护性。在使用它时,始终要考虑异常处理的最佳实践。

从这几行代码就能看出,我们在写业务的时候,考虑问题还是需要面面俱到的


http://www.ppmy.cn/ops/127532.html

相关文章

代码训练营 day41|LeetCode 1049,LeetCode 494,LeetCode 474

前言 这里记录一下陈菜菜的刷题记录,主要应对25秋招、春招 个人背景 211CS本CUHK计算机相关硕,一年车企软件开发经验 代码能力:有待提高 常用语言:C 系列文章目录 第42天 :第九章 动态规划part04 文章目录 前言系列…

Web保存状态的手段(请求转发,Cookie的使用)

一,掌握请求转发 请求转发与重定向技术都是跳转页面的途径,但是这两个技术之间也有不同之处。 请求转发更倾向于servlet跳转jsp,而重定向更倾向于servlet跳转到servlet。 1. 常用页面跳转方法2:请求转发(重写URL) RequestDispatcher接口对…

求职leetcode题目(14)

1.乘积最大子数组 解题思路: 标签:动态规划遍历数组时计算当前最大值,不断更新令imax为当前最大值,则当前最大值为 imax max(imax * nums[i], nums[i])由于存在负数,那么会导致最大的变最小的,最小的变最…

列出机器学习方向的创新点

以下是机器学习方向的一些创新点: 一、算法创新 新型神经网络架构 图神经网络(Graph Neural Networks,GNNs) 传统的神经网络主要处理欧几里得空间的数据,如图像(网格结构)和序列(线性结构)。然而,现实世界中有许多数据具有图结构,如社交网络、分子结构等。图神经网…

网络空间指纹:新型网络犯罪研判的关键路径

前言 新型网络犯罪是指利用计算机技术和互联网平台进行犯罪活动的一类犯罪行为。它涵盖了一系列使用网络和数字技术进行非法活动的行为,如网络钓鱼、网络诈骗、恶意软件攻击、黑客入侵、数据泄露、网络色情和社交网络犯罪等。 随着当前打击治理新型网络犯罪博弈态…

【数据库系统概论】第3章 关系数据库标准语言SQL(一)数据定义(超详细)

教材: 数据库系统概论(第6版)王珊,杜小勇,陈红编著 目录 一、SQL概述 1.1 SQL 的产生与发展 1.2 SQL的特点 1.3 SQL的基本概念 二、数据定义 2.1 数据库的定义 2.2 数据表的定义 2.3 模式的定义 一、SQL概述 1974年IBM为关系DBMS设…

JavaScript的第四天

目录 一、数组的使用(Array) 数组:将一组数据存储在单个变量下的一个集合。 1、创建数组的方法: (1)声明一个变量,将一个集合赋值给一个变量,该方法较为便捷简单,使用较多 &#xff…

【【自动驾驶】车辆运动学模型】

【自动驾驶】车辆运动学模型 1. 引言2. 以车辆重心为中心的单车模型2.1 模型介绍2.2 滑移角 β \beta β 的推导2.2 航向角 ψ \psi ψ推导过程:2.3 滑移角 β \beta β2.3 Python代码实现2.4 C代码实现 3. 前轮驱动的单车模型3.1 模型介绍3.3 Python代码实现3.4 …