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