@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 中,您可以通过 Docker Registry 创建本地私有仓库,并将 Docker 镜像推送到这个私有仓库。以下是具体步骤: 步骤 1:启动一个本地 Docker 私有仓库 拉取 registry 镜像: Docker 官方提供了一个 registry 镜像…...
vllm启动大语言模型时指定chat_template
问题介绍 在Linux下启动vllm: 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使用下面的命令测试出错: curl -X POST \http://127.0.0.1…...
网络相关(HTTP/TCP/UDP/IP)
网络相关 常见的状态码 100 临时响应 100 继续,请求者应当继续提出请求101 切换协议200 成功响应 200: 服务器成功处理请求201 以创建,请求成功并且服务器创建了新的资源202 已接受:服务器已接受请求,但尚未处理203 非授权信息:服务器已成功处理请求,但返回的信息可能来…...
TF卡长期不用会丢失数据吗?TF卡数据恢复容易吗?
在现代科技快速发展的时代,TF卡(TransFlash卡)作为便携式存储设备,广泛应用于手机、相机、无人机等多种电子设备中,成为我们日常存储照片、视频、文档等重要数据的得力助手。然而,关于TF卡长期不使用是否会…...
Flink状态一致性保证
前言 一个Flink作业由一系列算子构成,每个算子可以有多个并行实例,这些实例被称为 subTask,每个subTask运行在不同的进程或物理机上,以实现作业的并行处理。在这个复杂的分布式场景中,任何一个节点故障都有可能导致 F…...
前端一键复制解决方案分享
需求背景 用户需要对流水号进行复制使用,前端的展示是通过样式控制,超出省略号表示,鼠标悬浮展示完整流水号。此处的鼠标悬浮展示采用的是:title,这样就无法对文本进行选中。 下面是给出一键复制的不同的解决方案,希望…...
麒麟操作系统swap使用率过高的排查思路
现象:用户业务环境服务器在运行时,监控平台告警swap使用99%,在系统内查询物理内存使用39%左右,swap使用达99%。 问题排查: 1)使用命令查询使用了swap空间的进程并排序:for i in cd /proc;ls |gr…...
爬虫python=豆瓣Top250电影
主流程:获取数据,解析数据,保存数据 from bs4 import BeautifulSoup #网页解析获取数据 import re #正则表达式 import urllib.request,urllib.error #获取网页数据 import sqlite3 #轻量级数据库 import xlwt #进行excel操作 #影视详情…...
【Eclipse系列】解决Eclipse中xxx.properties文件中文乱码问题
问题描述:由于eclipse对Properties资源文件的编码的默认设置是ISO-8859-1,所以在打开.properties文件时,会发现中文乱码了,如图: 解决方法: 1、一次生效法 右击该properties文件–>properties–>Re…...
mysql主从复制及故障修复
一、主MySQL数据库的配置 分别在三台主机(chen2/10.110、chen3/10.120、chen4/10.130)中安装mysql数据,其中chen2/10.110作为主MySQL服务器,其余两台作为从MySQL服务器。 1、在主机上部署mysql数据库 详细的请看上一篇:mysql数据…...
基于springboot的网上服装购物商城系统
基于springboot的网上服装购物商城系统 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:idea 源码获取: &#x…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.
这个警告表明您在使用Vue的esm-bundler构建版本时,未明确定义编译时特性标志。以下是详细解释和解决方案: 问题原因: 该标志是Vue 3.4引入的编译时特性标志,用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...
PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础
在构建任何动态、数据驱动的Web API时,一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说,深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言,以及学会如何在Python中操作数据库,是…...
基于小程序老人监护管理系统源码数据库文档
摘 要 近年来,随着我国人口老龄化问题日益严重,独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长,随之而来的是日益突出的老年人问题,尤其是老年人的健康问题,尤其是老年人产生健康问题后&…...
