我对@SneakyThrows有疑问,可以使用它来偷偷地抛出已检查的异常,而无需在您的方法的throws子句中实际声明。
public class Demo {
public static void main(String[] args) {
}
private void throwE() throws ClassNotFoundException {
}
@SneakyThrows
private void t() {
throwE();
}
}
这是由龙目岛产生的。
public class Demo {
public Demo() {
}
public static void main(String[] args) throws IOException {
}
private void throwE() throws ClassNotFoundException {
}
private void t() {
try {
this.throwE();
} catch (Throwable var2) {
throw var2;
}
}
}
为什么lombok生成的代码可以伪造编译器而无需声明throws子句。
答案 0 :(得分:5)
请参见@SneakyThrows,它使用Lombok.sneakyThrow(t)
而不是var2
:
public void run() { try { throw new Throwable(); } catch (Throwable t) { throw Lombok.sneakyThrow(t); } }
答案 1 :(得分:0)
答案是Lombok欺骗了编译器-但是您所显示的是编译后的字节码的反编译版本-并且运行字节码的JVM无法区分已检查和未检查的异常:它不在乎。 / p>
如果您查看Lombok.sneakyThrow()
源代码,您会发现它最终会做两件事:
两者都作为编译的一部分被删除,这就是为什么您反编译的代码只是简单地抛出异常。