抛出异常的行为是否有可能引发不同的异常呢?
为了抛出异常,必须(可选)分配新对象,并调用其构造函数(隐式调用fillinstacktrace).在某些情况下,听起来也称为addSupressed.那么如果没有足够的内存会发生什么?JVM是否可以预先分配内置异常?例如,will(1/0)是否会抛出OutOfMemoryError而不是ArithmeticException?
此外,构造函数是一个方法调用,因此可以自由地抛出其他异常.在这种情况下会发生什么?内置的异常会抛出吗?即使你没有显式抛出,似乎也可能得到一个StackOverflowError.
public class MyStupidException extends Exception {
public MyStupidException() {
throw new RuntimeException("whoooo");
}
}
public static void main(String... args) throws Exception {
throw new MyStupidException();
}
Run Code Online (Sandbox Code Playgroud)
打印:
线程"main"中的异常java.lang.RuntimeException:whoooo
所以,是的:-)
在内置异常的情况下,有许多事情可能出错.我不相信规范要求JVM保证异常分配成功,所以OutOfMemoryError听起来像是一种明显的可能性.还有更多模糊的问题,例如类加载失败,可能发生.我们也可以进入彻头彻尾的深奥,有人修改java.lang.Exception过导致异常或错误抛出.
因此,我的意见是,您应该期望/计划在极少数情况下异常处理本身可能导致异常.