Java异常与C ++异常

时间:2009-05-08 06:21:21

标签: java c++ exception

存储例外的地方? 堆栈,堆。 如何为例外分配和取消分配内存? 现在,如果您有多个需要处理的异常,是否创建了所有这些异常的对象?

6 个答案:

答案 0 :(得分:7)

我认为异常的内存分配方式与所有其他对象(在堆上)的分配方式相同。

这曾经是一个问题,因为那时你无法为OutOfMemoryError分配内存, 这就是no stack trace until Java 1.6的原因。现在他们也为堆栈跟踪预先分配空间。

如果您想知道在抛出异常的引用的位置,JVM会在内部保留引用,同时解除调用堆栈以找到异常处理程序,然后获取引用(在其堆栈框架上,就像任何其他局部变量一样)。

不能同时抛出两个异常(在同一个线程上)。它们可以嵌套,但是只有一个“活动”异常,并且引用了嵌套异常。

当对异常的所有引用都消失时(例如在异常处理程序完成之后),异常会像其他所有内容一样被垃圾收集。

答案 1 :(得分:4)

对于C ++,它没有定义存储异常的位置,但大多数编译器使用特殊的堆栈。 对于以前有人写的Java,它们存储在堆上。

由于异常是C ++和Java中的对象,因此它们被分配并取消分配为特定语言的对象。

两种语言中每个线程始终只有一个例外。

答案 2 :(得分:2)

有关例外的最完整信息,我们可以直接转到Chapter 11: ExceptionsThe Java Language Specification, Second Edition来源。

例外确实是对象。它们是Throwable的子类:

  

每个例外都由一个表示   类Throwable或一个类的实例   其子类;这样的对象可以   被用来携带信息   发生异常的点   抓住它的处理程序。

因此,可能可以安全地假设,与Java中的任何其他Object一样,它将在堆上分配。

就拥有多个Exception对象而言,情况可能并非如此,因为一旦发生异常,Java虚拟机将开始寻找异常处理程序。

  

在投掷过程中   例外,Java虚拟机   突然完成,一个接一个,任何   表达,陈述,方法和   构造函数调用,初始化程序,   和字段初始化表达式   已经开始但尚未完成   在当前线程中执行。这个   进程一直持续到处理程序为止   发现它表明它处理   通过命名的特殊异常   异常的类或a   类的超类   异常。

有关如何在运行时处理异常的更多信息,Section 11.3 Handling of an Exception具有详细信息。

答案 3 :(得分:1)

Java中的异常是对象,因此它们存储在堆上。

抛出异常时,JVM会在代码中查找匹配的异常处理程序。即使存在多种可能引发的异常,这也适用。

答案 4 :(得分:1)

  

存储例外的地方?堆,   堆。如何分配内存和   是否因例外而被取消分配?

在这方面,例外是与其他任何对象相同的对象。通过new在堆上分配,由垃圾收集器解除分配。

  

现在,如果您有多个   需要处理的异常   是否有所有这些的对象   创建了例外?

不确定你的意思。它们是通过new创建的,一次一个。当您使用异常链接时,可能会有多个 - 并且实际上没有什么可以阻止您创建数以千计的异常并将它们放在某个列表中 - 它只是没有多大意义。

答案 5 :(得分:1)

在Java中,Exception扩展了Throwable,它扩展了Object。即从记忆的角度来看,它就像任何其他对象一样。

在Java 7中已经建议局部变量可以使用转义分析放置在堆栈上以查找堆栈变量的候选者。但是,异常通常会从方法抛出到调用者(或其调用者等),因此将异常放在堆栈上会非常有用。