0

抛出异常的行为是否有可能改为抛出不同的异常?

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

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

4

3 回答 3

5
public class MyStupidException extends Exception {
  public MyStupidException() {
    throw new RuntimeException("whoooo");
  }
}
public static void main(String... args) throws Exception {
  throw new MyStupidException();
}

印刷:

线程“主”java.lang.RuntimeException 中的异常:whoooo

所以,是的:-)

在内置异常的情况下,有很多事情可能会出错。我不相信规范要求 JVM 来保证异常分配成功,所以这OutOfMemoryError听起来像是一种明显的可能性。还有一些更模糊的问题,例如类加载失败,可能会发生。我们还可以进入彻头彻尾的深奥,其中有人进行了修改java.lang.Exception以导致异常或错误抛出。

因此,我的意见是,您应该期望/计划在极少数情况下,异常处理本身可能会导致异常。

于 2012-08-13T18:14:51.830 回答
4

如果没有足够的空间来创建ArthimeticException对象,它会通过,OutofMemoryError因为JVM除了退出进程之外没有其他方法可以继续。

于 2012-08-13T18:14:26.777 回答
1

你可以得到

Error err = null;
throw err; // triggers a NPE.

或者

// use up almost all the memory
throw new RuntimeException(); // throws OutOfMemoryError instead.
于 2012-08-13T18:27:24.973 回答