栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Lombok基本注解之@SneakyThrows

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Lombok基本注解之@SneakyThrows

1、@SneakyThrows注解

        @SneakyThrows注解:是由lombok为咱们封装的,它能够为咱们的代码生成一个try...catch块,并把异常向上抛出来。

使用范围: 只能作用在方法和构造函数之上 。

@SneakyThrows注解的作用得从java的异常设计体系说起。

1.1、java中常见的异常有两种:
  1. Exception即非运行时异常(编译异常)。
  2. RuntimeException即运行时异常。

第一种会强制要求抛出它的方法声明throws,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。设计的目的是为了提醒开发者处理一些场景中必然可能存在的异常情况。比如网络异常造成IOException。

但是现实,往往事与愿违。大部分情况下的异常,我们都是一路往外抛了事。所以渐渐的大家处理Exception的常见手段就是外面包一层RuntimeException,接着往上丢。这种解决思想尤其在Spring中到处出现。

如:

	try {
			
	} catch (Exception e) {
			throw new RuntimeException(e);
	}

Lombok的@SneakyThrows就是为了消除这样的模板代码。

@SneakyThrows
public void utf8ToString(byte[] bytes) {
    return new String(bytes, "UTF-8");
}


// 真正生成的代码
public void utf8ToString(byte[] bytes) {
    try {
        return new String(bytes, "UTF-8");
    } catch (Exception e) {
        throw Lombok.sneakyThrow(e);
    }
}    

 原理:

        显然魔法藏在throw Lombok.sneakyThrow(e); 中。可能大家都会以为这个方法就是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.sneakyThrow0(t);
}

private static  T sneakyThrow0(Throwable t) throws T {
    throw (T)t;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/937434.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号