龙目岛注解@SneakyThrows

时间:2018-11-21 12:50:51

标签: java lombok

我对@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子句。

2 个答案:

答案 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()源代码,您会发现它最终会做两件事:

  1. 空支票
  2. 演员

两者都作为编译的一部分被删除,这就是为什么您反编译的代码只是简单地抛出异常。