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

本文介绍了Lombok中的@SneakyThrows注解如何消除Java中常见的异常处理模板代码,通过将CheckedException隐式转换为RuntimeException,简化异常抛出和处理过程。
摘要由CSDN通过智能技术生成

Lombok中@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
    @SneakyThrows
    public 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;
    }

本文完结!

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

No8g攻城狮

向每一个努力改变现状的你致敬!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值