【Java用法】Lombok中@SneakyThrows注解的使用方法和作用

Lombok中@SneakyThrows注解的使用方法和作用

  • 一、@SneakyThrows的作用
  • 二、@SneakyThrows注解原理

一、@SneakyThrows的作用

普通Exception类,也就是我们常说的受检异常或者Checked Exception会强制要求抛出它的方法声明throws,调用者必须显示的去处理这个异常。设计的目的是为了提醒开发者处理一些场景中必然可能存在的异常情况。比如网络异常造成IOException。

但是现实大部分情况下的异常,我们都是一路往外抛了事。所以渐渐的java程序员处理Exception的常见手段就是外面包一层RuntimeException,接着往上丢。

try {// 业务代码
} catch(Exception e) {throw new RuntimeException(e);
}

而Lombok的@SneakyThrows就是为了消除这样的模板代码。使用注解后不需要担心Exception的处理。

示例代码如下:

package com.example.demozmq.thread;import java.io.UnsupportedEncodingException;
import lombok.SneakyThrows;public class SneakyThrowsTest implements Runnable{@SneakyThrows(UnsupportedEncodingException.class)public String utf8ToString(byte[] bytes) {return new String(bytes, "UTF-8");}@Override@SneakyThrowspublic void run() {throw new Throwable();}
}

通过编译器编译之后生成真正的代码如下:

package com.example.demozmq.thread;import java.io.UnsupportedEncodingException;public class SneakyThrowsTest implements Runnable {public SneakyThrowsTest() {}public String utf8ToString(byte[] bytes) {try {return new String(bytes, "UTF-8");} catch (UnsupportedEncodingException var3) {throw var3;}}public void run() {try {throw new Throwable();} catch (Throwable var2) {throw var2;}}
}

如下图所示(可以从target文件夹中查看):

在这里插入图片描述

二、@SneakyThrows注解原理

显然魔法它就藏在 Lombok.sneakyThrow(t); 中。可能大家都会以为这个方法就是 new RuntimeException() 之类的。然而事实并非如此。阅读代码可以看出整个方法其实最核心的逻辑是 throw (T)t; ,利用泛型将我们传入的 Throwable 强转为 RuntimeException。虽然事实上我们不是 RuntimeException 。但是没关系。因为JVM并不关心这个。泛型最后存储为字节码时并没有泛型的信息。这样写只是为了骗过javac编译器。

源码中注释有解释。源码如下:

    public static RuntimeException sneakyThrow(Throwable t) {if (t == null) throw new NullPointerException("t");return Lombok.<RuntimeException>sneakyThrow0(t);}private static <T extends Throwable> T sneakyThrow0(Throwable t) throws T {throw (T)t;}

本文完结!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/206458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣541.反转字符串 II

文章目录 力扣541.反转字符串 II示例代码实现总结收获 力扣541.反转字符串 II 示例 代码实现 class Solution {public String reverseStr(String s, int k) {char[] ans s.toCharArray();for(int i0;i<ans.length;i2*k){int begin i;int end Math.min(ans.length-1,begin…

理解chatGPT的Function calling

"Function calling" 是一个开发术语&#xff0c;指的是调用函数或方法来执行特定任务。在chatGPT中&#xff0c;"Function calling" 指的是我们可以通过发送特定的指令或命令来触发一些功能&#xff0c;让chatGPT执行一些预定义的任务。 chatGPT的工作方式…

【数据结构】链表算法总结

知识概览 链表包括单链表和双链表&#xff0c;这里讨论算法题中的链表。为了考虑算法题中对于时间效率的要求&#xff0c;链表通常是用数组模拟成静态链表的形式&#xff0c;速度快。单链表可以用来写邻接表&#xff08;包括n个链表&#xff09;&#xff0c;邻接表可以存储树和…

数据结构的基本操作

对于任何数据结构&#xff0c;基本操作就是 遍历访问&#xff08;增删改查&#xff09; 各种数据结构的遍历和访问两种形式&#xff1a;线性的和非线性的 一、线性形式 以 for/while 迭代为代表 数组遍历框架&#xff0c;是典型的线性迭代结构 void traverse(int[] arr){f…

走向未来能源之巅:可控核聚变的探索与挑战

走向未来能源之巅:可控核聚变的探索与挑战 引言 随着人类文明的进步和科技的发展,对能源的需求与日俱增。传统的化石燃料能源面临着枯竭和环境问题的双重压力,因此,寻找一种清洁、可持续、高效的能源成为了全球科学家的共同使命。在这个过程中,可控核聚变作为一种具有巨…

在Go中使用循环时使用Break和Continue语句

引言 在Go中使用for循环可以让你以一种高效的方式自动化和重复任务。 学习如何控制循环的操作和流程,可以在程序中自定义逻辑。你可以使用break和continue语句来控制循环。 break语句 在Go中,break语句终止当前循环的执行。break几乎总是与一个[条件if语句]配对。 让我们…

【无线网络技术】——无线局域网(学习笔记)

&#x1f4d6; 前言&#xff1a;本章首先介绍无线局域网的基本概念&#xff0c;然后详细介绍IEEE 802.11的基本工作原理&#xff0c;侧重于媒体访问控制和一跳范围内的通信技术。 目录 &#x1f552; 1. 概述&#x1f558; 1.1 覆盖范围&#x1f558; 1.2 特点&#x1f558; 1.…

【python爬虫】设计自己的爬虫 3. 文件数据保存封装

考虑到爬取的多媒体文件要保存到本地&#xff0c;因此封装了一个类来专门处理这样的问题&#xff0c;下面看代码&#xff1a; class FileStore:def __init__(self, file_path, read_file_moder,write_file_modewb):"""初始化 FileStore 实例Parameters:- file_…

如何将微服务注册到nacos服务上

首先可在maven的父工程的pom文件中添加maven的dependencyManagement标签&#xff0c;引入spring-cloud-alibaba-dependencies坐标 <properties><spring.cloud.alibaba.version>2.2.9.RELEASE</spring.cloud.alibaba.version></properties><!-- 管理…

关于近期互联网、大模型、Web3、大A的一点思考

写在2023-12-08 如果说硬件还存在着摩尔定律限制着&#xff0c;在14纳米以内&#xff0c;他们都不得不等着华为&#xff0c; 在软件领域&#xff0c;不管是传统的工业软件&#xff0c;还是当前的大模型&#xff0c;都不受制于摩尔定律&#xff0c; 换句话说&#xff0c;从星火…

苏宁商家电话采集软件使用教程

随着互联网的不断发展&#xff0c;电商行业也越来越受到人们的关注。作为国内最大的电商平台之一&#xff0c;苏宁易购已经成为了许多消费者的首选。在购物过程中&#xff0c;我们可能会遇到一些商家的电话打不通的情况&#xff0c;这给我们购物带来了很大的不便。为了解决这个…

ReactNative性能优化实践

ReactNative 性能优化主要分为以下几个方面&#xff1a; **减少 re-render&#xff1a;**re-render 是 React 的核心概念&#xff0c;也是性能优化的重点。re-render 会导致组件树重新渲染&#xff0c;这会消耗 CPU 和 GPU 资源。因此&#xff0c;减少 re-render 是提升性能的…

watch

类型&#xff1a;{ [key: string]: string | Function | Object | Array } 详细&#xff1a; 一个对象&#xff0c;键是需要观察的表达式&#xff0c;值是对应回调函数。值也可以是方法名&#xff0c;或者包含选项的对象。Vue 实例将会在实例化时调用 $watch()&#xff0c;遍…

C语言百钱买百鸡

"百钱买百鸡"是一个经典的数学问题&#xff0c;源自中国古代的《张丘建在东坡解百子图诗》一书中。这个问题要求找出所有的整数解&#xff0c;用100元钱买100只鸡&#xff0c;每只公鸡5元&#xff0c;每只母鸡3元&#xff0c;小鸡1元3只。 在C语言中&#xff0c;我们…

Vue框架入门与实践之一

1.Vue基础原理&#xff1a; &#xff08;1&#xff09;vue.js中有两个核心功能&#xff1a;响应式数据绑定&#xff0c;组件系统 &#xff08;2&#xff09;MVC,MVP,MVVM之间的区别和理解&#xff1b; *****MVC&#xff1a; 1) 视图(View):用户界面2) 控制器(Controller)&#…

快应用组件通信

1.父组件给子组件传值(props) props 父组件 <import name"son" src"./son"></import><template><div class"father"><text>父组件</text><son say"{{say}}" prop-object"{{obj}}"…

开发者热评:关于App出海营销,他们表示要做好两件事!

NetMarvel 投身于开发者出海用户增长/广告变现业务已将近9个年头&#xff0c;帮助国内外众多开发者解决全球移动营销难题&#xff0c;最大化收益&#xff0c;实现全球范围内的极速增长。 NetMarvel有效助力Piggy Go、VNG、Candy Crack等游戏应用&#xff0c; Shopee、Tango等非…

进度猫:让项目进度更加可控的项目管理工具

你是否曾经在项目管理中遇到过以下问题&#xff1a; 无法准确掌握项目进度&#xff1b;任务分配不公平不合理&#xff1b;项目资源无法得到有效利用&#xff1b;项目风险无法及时发现和应对&#xff1b;项目质量无法得到保障&#xff1b;项目团队成员之间缺乏有效的沟通和协作…

【分布式微服务专题】从单体到分布式(二、SpringCloud整合Nacos)

目录 前言阅读对象阅读导航前置知识笔记正文一、下载安装二、项目整合2.1 服务注册与发现2.2 动态配置管理 三、其他实验四、服务之间的调用 学习总结感谢 前言 本篇笔记主要是记录我整合Nacos项目进来的过程。以实现服务注册发现&#xff0c;以及分布式配置管理。关于Nacos&a…

重塑未来工作方式,亚马逊云科技re:Invent推出生成式AI助手Amazon Q

亚马逊云科技在re:Invent 2023宣布推出Amazon Q&#xff0c;这是一种新型生成式AI支持的助手&#xff0c;专门用于满足办公场景需要&#xff0c;可以根据客户业务进行定制。客户可以快速获得复杂问题的相关答案、生成内容并采取行动——所有这些都基于客户自身的信息存储库、代…