抛出异常对象创建

时间:2017-09-23 21:48:00

标签: java try-catch

实现catch语句时是否创建了异常对象?

例如,catch(ArithmeticException someObject)

是否必须明确将此对象创建为实例?

3 个答案:

答案 0 :(得分:0)

有两件事创建例外情况第二抛出例外

创建异常实例看起来像创建类的任何实例,例如NullPointerException npe = new NullPointerException();,此时我们没有做任何事情而不是创建实例,有些时候我们没有自己创建Exception实例,我们将会看到

创建Exception类的实例后,

抛出异常我们throw,你可以自己抛出异常,或者 JVM 会抛出

try
{
   int a = 10/0;
}catch(ArithmeticException  a)
{
     RuntimeException exception = new RuntimeException("a very bad error occured", a);
     throw exception;
}

当Java尝试计算10/0时会遇到算术错误,因此 JVM 会创建一个类ArithmeticException的实例并抛出这个创建的实例,您可以在{ {1}}子句,我们在其中创建类catch的实例,它只是一个对象,然后使用RuntimeException

抛出它

答案 1 :(得分:0)

Arithmetic异常的情况下,异常对象由JVM 在抛出异常时创建

在内部,它正在执行等效的new来创建异常对象。会发生什么是这样的:

  1. 整数除法指令导致硬件陷阱/异常
  2. 操作系统将其分派给由JVM实现的信号处理程序
  3. JVM识别导致问题的线程
  4. JVM创建异常,并填充堆栈框架信息
  5. JMV在违规线程
  6. 上抛出异常
  7. 异常传播
  8. 最终,您的catch子句匹配异常并处理它。
  9. 源代码中不需要Java new语句来实现此目的,

    在JVM抛出异常的其他情况下会发生类似的事情;例如典型的NullPointerExceptionArrayIndexOutOfBoundsExceptionStackOverflowError例外情况,但在某些情况下,前3个或4个步骤已经过优化......具体取决于JVM等。

    注意:(通常)在抛出异常的位置创建异常对象,因为这是可以捕获堆栈跟踪信息的时间。捕获异常时,原始堆栈框架早已消失。如果异常被捕获然后在另一个堆栈上重新抛出......或类似的东西,那就更是如此了。

答案 2 :(得分:0)

您正在创建一个对象。但是你没有创建它的实例。

当有人抛出它时,会创建Exception对象实例。

try {
    Foo foo = null;
    foo.dofoo();
} catch(NullPointerException e) {
    // ...
}

在这种特殊情况下,JVM创建了您在catch块中处理的NullPointerException对象实例。

用少数几个词来想象,在JVM的某些部分,有类似的东西:

if (obj == null) {
    throw new NullPointerException();
}

不要认真对待以前的代码示例。它是Exception throw的示例。