当前位置: 首页 > 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
是一个方便的工具,可以减少代码的复杂性,但需要谨慎使用,以免影响代码的可读性和维护性。在使用它时,始终要考虑异常处理的最佳实践。

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

相关文章:

@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 Interru…...

怎么把ppt页面切换为竖页?首推使用这个在线ppt工具!

熟悉ppt的朋友都知道,最常见的ppt演示文稿为横版样式,且一旦确定了ppt的版式,后续所有页面会保持相同的大小,但有时横版不能满足我们需求,想单独把其中一页或多页变为竖页,Office Powerpoint就无能为力了。…...

【JavaEE】——自定义协议方案、UDP协议

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:自定义协议 1:自定义协议 (1)交互哪些信息 &…...

python爬虫快速入门之---Scrapy 从入门到包吃包住

python爬虫快速入门之—Scrapy 从入门到包吃包住 文章目录 python爬虫快速入门之---Scrapy 从入门到包吃包住一、scrapy简介1.1、scrapy是什么?1.2、Scrapy 的特点1.3、Scrapy 的主要组件1.4、Scrapy 工作流程1.5、scrapy的安装 二、scrapy项目快速入门2.1、scrapy项目快速创建…...

【Photoshop——肤色变白——曲线】

1. 三通道曲线原理 在使用RGB曲线调整肤色时,你可以通过调整红、绿、蓝三个通道的曲线来实现黄皮肤到白皮肤的转变。 黄皮肤通常含有较多的红色和黄色。通过减少这些颜色的量,可以使肤色看起来更白。 具体步骤如下: 打开图像并创建曲线调…...

[python]从零开始的API调用教程

一、API是什么? API即应用程序编程接口,是一组定义了不同软件系统或组件之间如何交互的规则和协议。API为开发者提供了一种简化的方式,通过预定义的函数或方法,来使用某个软件、库、操作系统或硬件的功能,而不需要深入…...

FFmpeg 怎样根据图片和文本生成视频

使用FFmpeg根据图片和文本生成视频,你可以使用image2过滤器来处理图片,并使用subtitles过滤器来添加文本。以下是一个基本的命令行示例,它将图片转换为视频,并将文本作为字幕叠加: ffmpeg -loop 1 -i image.jpg -vf &…...

paddlepaddle显存未正常释放

NVIDIA GPU 显存未正常释放 问题描述 paddlepaddle 训练过程出现问题中断等导致GPU显存没有释放。 情况1: 使用nvidia-smi -l查看显存占用情况,输出结果中没有显示PID,但是有显存占用。 解决方法 使用killall python 直接kill掉所有python进程。假如运行此命…...

websocket的使用

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 2.配置websocket服务 Configuration public class WebSocketConfig {/*** 配置WebSocket服…...

docker如何建立本地私有仓库,并将docker镜像推到私有仓库

在 Docker 中&#xff0c;您可以通过 Docker Registry 创建本地私有仓库&#xff0c;并将 Docker 镜像推送到这个私有仓库。以下是具体步骤&#xff1a; 步骤 1&#xff1a;启动一个本地 Docker 私有仓库 拉取 registry 镜像&#xff1a; Docker 官方提供了一个 registry 镜像…...

vllm启动大语言模型时指定chat_template

问题介绍 在Linux下启动vllm&#xff1a; python3 -m vllm.entrypoints.openai.api_server --host 0.0.0.0 --model /model/Baichuan2-7B-Chat --trust-remote-code --gpu-memory-utilization 0.80使用下面的命令测试出错&#xff1a; curl -X POST \http://127.0.0.1…...

网络相关(HTTP/TCP/UDP/IP)

网络相关 常见的状态码 100 临时响应 100 继续,请求者应当继续提出请求101 切换协议200 成功响应 200: 服务器成功处理请求201 以创建,请求成功并且服务器创建了新的资源202 已接受:服务器已接受请求,但尚未处理203 非授权信息:服务器已成功处理请求,但返回的信息可能来…...

TF卡长期不用会丢失数据吗?TF卡数据恢复容易吗?

在现代科技快速发展的时代&#xff0c;TF卡&#xff08;TransFlash卡&#xff09;作为便携式存储设备&#xff0c;广泛应用于手机、相机、无人机等多种电子设备中&#xff0c;成为我们日常存储照片、视频、文档等重要数据的得力助手。然而&#xff0c;关于TF卡长期不使用是否会…...

Flink状态一致性保证

前言 一个Flink作业由一系列算子构成&#xff0c;每个算子可以有多个并行实例&#xff0c;这些实例被称为 subTask&#xff0c;每个subTask运行在不同的进程或物理机上&#xff0c;以实现作业的并行处理。在这个复杂的分布式场景中&#xff0c;任何一个节点故障都有可能导致 F…...

前端一键复制解决方案分享

需求背景 用户需要对流水号进行复制使用&#xff0c;前端的展示是通过样式控制&#xff0c;超出省略号表示&#xff0c;鼠标悬浮展示完整流水号。此处的鼠标悬浮展示采用的是:title&#xff0c;这样就无法对文本进行选中。 下面是给出一键复制的不同的解决方案&#xff0c;希望…...

麒麟操作系统swap使用率过高的排查思路

现象&#xff1a;用户业务环境服务器在运行时&#xff0c;监控平台告警swap使用99%&#xff0c;在系统内查询物理内存使用39%左右&#xff0c;swap使用达99%。 问题排查&#xff1a; 1&#xff09;使用命令查询使用了swap空间的进程并排序&#xff1a;for i in cd /proc;ls |gr…...

爬虫python=豆瓣Top250电影

主流程&#xff1a;获取数据&#xff0c;解析数据&#xff0c;保存数据 from bs4 import BeautifulSoup #网页解析获取数据 import re #正则表达式 import urllib.request,urllib.error #获取网页数据 import sqlite3 #轻量级数据库 import xlwt #进行excel操作 #影视详情…...

【Eclipse系列】解决Eclipse中xxx.properties文件中文乱码问题

问题描述&#xff1a;由于eclipse对Properties资源文件的编码的默认设置是ISO-8859-1&#xff0c;所以在打开.properties文件时&#xff0c;会发现中文乱码了&#xff0c;如图&#xff1a; 解决方法&#xff1a; 1、一次生效法 右击该properties文件–>properties–>Re…...

mysql主从复制及故障修复

一、主MySQL数据库的配置 分别在三台主机&#xff08;chen2/10.110、chen3/10.120、chen4/10.130)中安装mysql数据&#xff0c;其中chen2/10.110作为主MySQL服务器&#xff0c;其余两台作为从MySQL服务器。 1、在主机上部署mysql数据库 详细的请看上一篇&#xff1a;mysql数据…...

基于springboot的网上服装购物商城系统

基于springboot的网上服装购物商城系统 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xff1a; &#x…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...