抛出异常会改变它的状态吗?

时间:2013-07-31 16:53:10

标签: java exception

我做了一些像这样的简单实验:

public static void main(String[] args) {
    try {
        NullPointerException n = new NullPointerException();
        System.out.println(Lists.newArrayList(n.getStackTrace()));
        n.printStackTrace();
        System.out.println(Lists.newArrayList(n.getStackTrace()));
        throw n;
    } catch (NullPointerException e) {
        e.printStackTrace();
        System.out.println(Lists.newArrayList(e.getStackTrace()));
    }
}

并获得如下输出:

java.lang.NullPointerException
    at MyTest.main(MyTest.java:231)
java.lang.NullPointerException
    at MyTest.main(MyTest.java:231)
[MyTest.main(AbstractScannerTest.java:231)]
[MyTest.main(AbstractScannerTest.java:231)]
[MyTest.main(AbstractScannerTest.java:231)]

但是我想知道抛出异常时是否做了什么。这是一个主要的学术问题,但如果异常是API的一部分,并且在提供给实现时可能会或可能不会被抛出,则在某些情况下它可能是相关的。

2 个答案:

答案 0 :(得分:2)

不,Throwable操作不会修改throw对象本身;它简单地传递给调用堆栈,类似于方法的参数。 Throwable通常被设计为不可变对象,并且没有setter,但有些支持修改堆栈跟踪,以便RPC或类似框架可以确保包含适当的错误跟踪信息。也就是说,Throwable是一个像任何其他对象一样的对象,你可以写一个Throwable类,它有一个在catch块中调用的mutator方法,虽然这不常见。

答案 1 :(得分:1)

我什么都不知道。

是两个关键的事情
  • 创建Throwable时
  • 当调用getStackTrace()时,它会填充实际的数组(直到那时它被存储在堆中)