Lombok注解 @SneakyThrows
阅读数:104 评论数:0
跳转到新版页面分类
python/Java
正文
一、简介
1、java中我们常见的两类异常:
(1)普通Exception类
(2)RuntimeException
前者会强制要求抛出它的方法声明throws,调用者必须显示的去处理这个异常。设计的目的是为了提醒开发者处理一些场景中必然可能存在的异常情况。
但是大部情况下的异常,我们都是一路往外抛了事,所以常见的处理手段就是外面包一层RuntimeException,接着往上丢,这种解决思想在Spring中很常见。
try{
}catch(Exception e){
throw new RuntimeException(e);
}
2、Lombok的@SneakyThrows
@SneakyThrows 注解的作用是将被注解的方法中的受检查异常(checked exception)转换为不受检查异常(unchecked 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 SneakyThrowsExample 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);
}
}
}
二、原理
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;
}
利用泛型将我们传入的Throwable强转为RuntimeException,因为泛型被存储为字节码时并没有泛型的信息,所以可以骗过javac编译器。
三、Java中两种异常类型
1、受检异常(Checked Exception)
(1)受检异常是指在编译时必须处理的异常。这些异常必须在代码中显式地进行捕获(使用try-catch语句)或者在方法声明中通过throws子句声明抛出,否则编译器会报错。
(2)典型的受检异常包括IOException、SQLException等。这些异常通常表示程序在运行时遇到了无法预知的外部条件或错误,需要程序员在代码中进行处理。
2、非受检异常(Unchecked Exception)
(1)非受检异常是指在编译时不需要强制处理的异常。这些异常通常是由程序员的错误或者运行环境的严重问题导致的,比如空指针异常(NullPointerException)、数组下标越界异常(ArrayIndexOutOfBoundsException)等。
(2)与受检异常不同,编译器不会强制要求程序员在代码中处理非受检异常,因此也可以称为运行时异常(RuntimeException)
(3)非受检异常一般是程序员可以预见并且应该尽量避免的异常,它们通常暗示着代码中存在错误或不合理的设计。