抛出vs Java字节码

时间:2014-01-24 10:09:31

标签: java exception bytecode

方法的throws列表显然在编译期间起作用。然而,它在运行时是否有任何影响?

例如,如果我有一个没有throws列表的方法并且使用黑暗的字节码魔法来召唤并抛出IncrediblyCheckedException,它会毫无疑问地抛出它,或者运行时验证器会注意到这一点并抛出是错误还是其他什么?

1 个答案:

答案 0 :(得分:6)

它对运行时没有任何影响。一个很好的例子:

Thread.currentThread.stop(new Exception());

可以在任何地方编写,代码行将抛出异常。

上面将从本机代码中抛出异常,但这是使用普通Java throw的另一个技巧:

public static void main(String[] args) {
    CurrentClass.<RuntimeException>sneakyThrow(new Exception());
}
@SuppressWarnings("unchecked")
private static <E extends Throwable> void sneakyThrow(Throwable t) throws E { 
  throw (E)t; 
}