Java:抛出异常会引发异常吗?

时间:2012-08-13 18:11:33

标签: java exception

抛出异常的行为是否有可能引发不同的异常呢?

为了抛出异常,必须(可选)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来也称为addSupressed。那么如果没有足够的内存会发生什么? JVM是否可以预先分配内置异常?例如,will(1/0)是否会抛出OutOfMemoryError而不是ArithmeticException?

此外,构造函数是一个方法调用,因此可以自由地抛出其他异常。在这种情况下会发生什么?内置的异常会抛出吗?即使你没有显式抛出,似乎也可能得到一个StackOverflowError。

3 个答案:

答案 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.