当前位置: 首页 > news >正文

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

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.lryc.cn/news/465190.html

相关文章:

  • 怎么把ppt页面切换为竖页?首推使用这个在线ppt工具!
  • 【JavaEE】——自定义协议方案、UDP协议
  • python爬虫快速入门之---Scrapy 从入门到包吃包住
  • 【Photoshop——肤色变白——曲线】
  • [python]从零开始的API调用教程
  • FFmpeg 怎样根据图片和文本生成视频
  • paddlepaddle显存未正常释放
  • websocket的使用
  • docker如何建立本地私有仓库,并将docker镜像推到私有仓库
  • vllm启动大语言模型时指定chat_template
  • 网络相关(HTTP/TCP/UDP/IP)
  • TF卡长期不用会丢失数据吗?TF卡数据恢复容易吗?
  • Flink状态一致性保证
  • 前端一键复制解决方案分享
  • 麒麟操作系统swap使用率过高的排查思路
  • 爬虫python=豆瓣Top250电影
  • 【Eclipse系列】解决Eclipse中xxx.properties文件中文乱码问题
  • mysql主从复制及故障修复
  • 基于springboot的网上服装购物商城系统
  • aws(学习笔记第六课) AWS的虚拟私有,共有子网以及ACL,定义公网碉堡主机子网以及varnish反向代理
  • 接口测试(三)jmeter——连接mysql数据库
  • 双十一购物节有哪些好物值得入手?2024双十一好物清单合集分享
  • jmeter中请求参数:Parameters、Body Data的区别
  • Docker安装ActiveMQ镜像以及通过Java生产消费activemq示例
  • 迅为RK3562开发板/核心板240PIN引脚全部引出,产品升级自如
  • C++实现顺序栈和链栈操作(实验3--作业)
  • 龙兴物联一体机:设备监测的智能先锋
  • KinectDK相机SDK封装Dll出现k4abt_tracker_create()创建追踪器失败的问题
  • Linux 命令—— ping、telnet、curl、wget(网络连接相关命令)
  • 高速缓冲存储器Cache是如何工作的、主要功能、高速缓冲存储器Cache和主存有哪些区别