欢迎光临

我们一直在努力
当前位置:首页 > 编程技术 >

Lombok注解-@SneakyThrows的使用

日期:
后台-插件-广告管理-首页/栏目/内容广告位一(PC)
后台-插件-广告管理-首页/栏目/内容广告位一(手机)
目录
  • Lombok注解@SneakyThrows
    • 原理
  • lombok注解@SneakyThrows探索及与try catch、throws Exception区别
    • 导入 Maven
    • 方法测试

Lombok注解@SneakyThrows

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

java中我们常见的2类异常。

  • 1.普通Exception类,也就是我们常说的受检异常或者Checked Exception。
  • 2.RuntimeException类,既运行时异常。

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

但是现实,往往事与愿违。大部分情况下的异常,我们都是一路往外抛了事。(强制处理我也处理不了啊!臣妾做不到)所以渐渐的java程序员处理Exception的常见手段就是外面包一层RuntimeException,接着往上丢。这种解决思想尤其在Spring中到处出现。

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

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

使用注解后不需要担心Exception的处理

import lombok.SneakyThrows;
public class SneakyThrowsExample implements Runnable {
 @SneakyThrows(UnsupportedEncodingException.class)
 public String utf8ToString(byte[] bytes) {
  return new String(bytes, "UTF-8");
 }

 @SneakyThrows
 public void run() {
  throw new Throwable();
 }
}

真正生成的代码

import lombok.Lombok;
public class S编程neakyThrowsExample implements Runnable {
 public String utf8ToString(byte[] bytes) {
  try {
   return new String(bytes, "UTF-8");
  } catch (UnsupportedEncodingException e) {
   throw Lombok.sneakyThrow(e);
  }
 }

 public void run() {
  try {
   throw new Throwable();
  } catch (Throwable t) {
   throw Lombok.sneakyThrow(t);
  }
 }
}

原理

显然魔法 藏在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;
  }

lombok注解@SneakyThrows探索及与try catch、throws Exception区别

我在一个开源项目中看到了lombok注解@SneakyThrows,于是探索实践了一下,有些事情还是要自己操作一下,不然还真的不知道!!

以前就看到项目里有@SneakyThrows注解,一直没去管他和手动try catch还有往上抛异常有什么区别?

先说一下结论,赶时间的朋友看了就可以走了哈!!

我们发现,@SneakyThrows注解在编译的时候自动帮我们try catch,使用@SneakyThrows是为了让代码更加简洁,加快我们的开发效率!!所以还是推荐使用@SneakyThrows来解决异常问题,当然如果是已知异常还是自己手动throw。

导入 Maven

<!--Lombok-->
<dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <scope>provided</scope>
</dependency>

方法测试

public class SneakyTest {
  public static void main(String[] args) {
    exceptionTest();
  }
  public static void exceptionTest(){
    // 模拟一个异常
    FileInputStream fis = new FileInputStream(new File("test.txt"));
  }
}

此时Idea提醒我们要捕获异常,不然无法通过编译,给出我们三种解决方案,也就是我们本次要探究的目的!!

我们先第一种方式:

public class SneakyTest {
    public static void main(String[] args) throws FileNotFoundException {
        exceptionTest();
    }
    public static void exceptionTest() throws FileNotFoundException {
        // 模拟一个异常
        FileInputStream fis = new FileInputStream(new File("D:\\test.txt"));
    }
}
[!--empirenews.page--]

我们看到我们往上级抛,上级也需要抛,这种一直抛还是要有人处理,所以我们不建议这样!

第二种方式:

public class SneakyTest {
    public static void main(String[] args) {
        exceptionTest();
    }
    public static void exceptionTest(){
        // 模拟一个异常
        try {
            FileInputStream fis = new FileInputStream(new File("D:\\test.txt"));
        } catch (FileNotFoundException e) {
            e.printhttp://StackTrace();
        }
    }
}

我们在本方法内处理,这样就不需要调用者处理了!!

第三种方式:

也是小编一直疑惑的,为啥会有这个注解,有什么优点吗??

先看解决方式,我们在编译一下看看究竟怎么解决的异常!!

public class SneakyTest {
    public static void main(String[] args) {
        exceptionTest();
    }
    @SneakyThrows
    public static void exceptionTest(){
        // 模拟一个异常
        FileInputStream fis = new FileInputStream(new File("D:\\test.txt"));;
    }
}

我们编译一下看一下,下面是class文件

public class SneakyTest {
    public SneakyTest() {
    }
    public static void main(String[] args) {
        exceptionTest();
    }
    public static void exceptionTest() {
        try {
            new FileInputStream(new File("D:\\test.txt"));
        } catch (Throwable var1) {
            throw var1;
        }
    }
}

我们发现,这个注解自动帮我们try catch,使用@SneakyThrows是为了让代码更加简洁,加快我们的开发效率!!

这样我们就测试完成了,主要介绍了@SneakyThrows到底帮我们解决了什么问题,我们为什么要使用@SneakyThrows。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。 

后台-插件-广告管理-首页/栏目/内容广告位二(PC)
后台-插件-广告管理-首页/栏目/内容广告位二(手机)
后台-插件-广告管理-内容广告位三(PC)
后台-插件-广告管理-内容广告位三(手机)

相关阅读

后台-插件-广告管理-内容广告位四(PC)
后台-插件-广告管理-内容广告位四(手机)

热门文章

后台-插件-广告管理-侧边广告位一(PC)
后台-插件-广告管理-侧边广告位一(手机)
  • HTML 表单组件实例代码

  • HTML 表单用于搜集不同类型的用户输入。下文通过代码给大家分享html 表单组件实例代码,感兴趣的朋友参考下吧 废话不多说了,直接给大家贴代码了,具体代码如下所示: <!DOCTYPE
  • html2canvas 将html代码转为图片的使用方法

  • 转换代码到图片使用 html2canvas,这是一个非常著名的从浏览器网页截图的开源库,使用很方便,功能也很强大。 使用 html2canvas http:// html2canvas 的使用非常简单,简单
  • HTML网页中插入视频的方法小结

  • 现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(Opera、Mozilla、Chrome),支持H.264的(Safari、IE 9、Chrome),都不支持的(IE6、
  • HTML实现文本框只读不能修改其中的内容

  • 废话不多说了,直接给大家贴代码了,具体代码如下所示: <!--方法1:>http:// 当鼠标放不上就离开焦点 --> <input type="text" name="input1" value=http://www.cppcns.com/web
  • 移动端专用的meta标签设置大全

  • 前言 之前学习前端中,对meta标签的了解仅仅只是这一句。 <meta charset="UTF-8"> 但是打开任意的网站,其head标签内都有一列的meta标签。比如我们我们网站,但是自己却很不熟
后台-插件-广告管理-侧边广告位二(PC)
后台-插件-广告管理-侧边广告位二(手机)

最新文章

  • 在Asp.net core项目中使用WebSocket

  • 今天小试了一下在ASP.NET core中使用websocket,这里记录一下: 在 Startup 类的 Configure 方法中添加 WebSocket 中间件。 app.UseWebSockets(); 它也可以传入一些参数 app.Us
  • Vue快速理解事件绑定是什么

  • 目录一、监听事件二、事件修饰符1、stop修饰符阻止事件冒泡2、capture修饰符3、self修饰符4、prevent修饰符5、键盘事件修饰符6、鼠标事件修饰符一、监听事件 监听事件一般
  • C#实现模拟ATM自动取款机功能

  • 目录(1)关于用户帐号的类:Account(2)关于银行数据库的类:BankDatabase(3)关于ATM屏幕显示的类:Screen(4)关于ATM键盘的类:Keypad(5)关于进钞、出钞口的类:DepositSlot(6)关于ATM
  • Java设计模式之抽象工厂模式浅析讲解

  • 1.介绍 当系统准备为用户提供一系列相关对象,又不想让用户代码和这些对象形成耦合时,就可以使用抽象工厂模式。 2.如何实现 1)抽象产品--Car 2)具体产品--BYDCar、TSLCar 3)抽象
  • 如何动态替换Spring容器中的Bean

  • 目录动态替换Spring容器中的Bean原因方案实现Spring中的bean替换问题动态替换Spring容器中的Bean 原因 最近在编写单测时,发现使用 Mock 工具预定义 Service 中方法的行为特
  • C#优雅的实现INotifyPropertyChanged接口

  • INotifyPropertyChanged接口在wpF或WinFrom程序中使用还是经常用到,常用于通知界面属性变更。标准写法如下: class NotifandroidyObject : INotifyPropertyChanged {
后台-插件-广告管理-侧边广告位三(PC)
后台-插件-广告管理-侧边广告位三(手机)