ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Lombok的@SneakyThrows详解

2022-07-27 15:33:31  阅读:199  来源: 互联网

标签:RuntimeException SneakyThrows private 详解 Lombok 异常 throw


Lombok的@SneakyThrows详解

 

目录

 

一、简介

​ 在java的异常体系中Exception异常有两个分支,一个是运行时异常RuntimeException,一个是编译时异常,在Exception下的所有非RuntimeException异常,比如IOExceptionSQLException等;所有的运行时异常不捕获,编译时异常是一定要捕获,否则编译会报错。@SneakyThrows就是利用了这一机制,将当前方法抛出的异常,包装成RuntimeException,骗过编译器,使得调用点可以不用显示处理异常信息。

二、原理

/*
 * 若不使用@SneakyThrows注解,newInsstance方法会要求抛出InstantiationException, 
 * IllegalAccessException异常,且调用sneakyThrowsTest()的地方需要捕获这些异常,
 * 加上@SneakyThrows注解之后就不需要捕获异常信息。
 */
@SneakyThrows
private void sneakyThrowsTest(){
  SneakyThrowsDemo.class.newInstance();
}

如下为反编译之后的结果

private void sneakyThrowsTest() {
    try {
      HelloController.class.newInstance();
    } catch (Throwable e) {
      // 调用Lombok方法转化为RuntimeException
      throw Lombok.sneakyThrow(e);
    }
}


// =========== ombok =========
public static RuntimeException sneakyThrow(Throwable t) {
  if (t == null) {
    throw new NullPointerException("t");
  } else {
    return Lombok.<RuntimeException>sneakyThrow0(t);
  }
}

/*
 * 这个方法是关键,这里对入参类型的约束为<T extends Throwable>,将异常强转为T类型
 */
private static <T extends Throwable> T sneakyThrow0(Throwable t) throws T {
  throw (T)t;
}

那么问题来了,为什么这个地方可以对原来的异常进行强转为RuntimeExcption?以下为直接强转的代码,显然运行之后报类型转换异常。

private void sneakyThrowsTest() {
  try {
    throw new Exception();
  } catch (Throwable e) {
    // 直接将e强转为RuntimeException,运行到这里会报类型转换异常。
    throw (RuntimeException)e;
  }
}

实际上,这种做法是一种通过泛型欺骗了编译器,让编译器在编译期不报错,而最后在JVM虚拟机中执行的字节码的并没有区别编译时异常和运行时异常,只有是不是和抛不抛异常而已。

标签:RuntimeException,SneakyThrows,private,详解,Lombok,异常,throw
来源: https://www.cnblogs.com/csnjava/p/16525023.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有