突然想起之前看的一篇文章,涉及到异常处理的一个注解,却发现已经没有记忆了,所以赶紧找到原文记录一下。
编译时异常会强制要求我们来进行处理,要么try-catch,要么直接往外抛,设计的最初目的是为了提醒开发人员注意这些异常,比如IOException。但是有些异常实在是处理不了,只有往外抛,但是这好像不太合理,渐渐的程序猿想到了直接封装一下,让编译器认为它是一个运行时异常,并不需要我现在显示处理:
try{
}catch(Exception e){
throw new RuntimeException(e);
}
所以Lombok为我们考虑消除这样的模板代码:
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();
}
}
我们可以直接在方法上使用@SneakyThrows注解,虽然事实上我们不是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;
}
参考文章:https://www.jianshu.com/p/7d0ed3aef34b