2012-08-13 265 views
0

是否有可能抛出一个异常来抛出一个不同的异常呢?Java:可以抛出异常抛出异常吗?

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

此外,构造函数是一个方法调用,因此可以自由地抛出其他异常。在这种情况下会发生什么?内建的例外会抛出吗?即使你没有明确抛出,看起来可能会得到一个StackOverflowError。

回答

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以引发异常或错误。

所以,我的意见是,你应该期望/计划在特殊情况下异常处理本身可能导致异常。

+0

虽然完全正确的,我不认为这是他在问什么相当。 – Charles 2012-08-13 18:23:44

+0

内建异常情况如何? – Antimony 2012-08-13 18:25:10

+0

@Charles:问题是“是否有可能抛出异常来抛出不同的异常?”,所以它正在回答所述的问题。如果意图不同,那么我们应该更新问题:-) – 2012-08-13 18:38:01

4

如果没有足够的空间来创建ArthimeticException对象,它将通过OutofMemoryError,因为除退出进程外,JVM无法继续。

1

你可以得到

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

// use up almost all the memory 
throw new RuntimeException(); // throws OutOfMemoryError instead. 
+0

是的,但抛出null是记录的行为,而不是异常处理的副作用。 – Antimony 2012-08-13 19:04:39

+0

副作用也记录在案。你在寻找任何无证的“功能”?你有没有遇到问题,在哪里看到意外的行为? – 2012-08-13 19:08:03

+0

“此规范无法预测可能遇到内部错误或资源限制的位置,因此可能无法准确报告它们的时间。因此,下面定义的任何VirtualMethodError子类可能会在Java操作过程中的任何 时间虚拟机:“ - 嗯,我想这回答了内置例外的问题。奇怪的是,它没有提到有关fillinstack trace的任何信息。我想这是一个疏忽。 – Antimony 2012-08-13 19:56:51