5

我已经进行了一些简单的实验,如下所示:

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 的一部分并且在提供给实现时可能会或可能不会被抛出,这可能是相关的。

4

2 回答 2

2

不,Throwable对象本身不会被throw操作修改;它只是简单地向上传递调用堆栈,类似于方法的参数。 Throwables 通常被设计为不可变对象并且没有设置器,尽管有些支持修改堆栈跟踪,以便 RPC 或类似框架可以确保包含适当的错误跟踪信息。也就是说,aThrowable和其他对象一样是一个对象,您可以编写一个Throwable具有要在块中调用的 mutator 方法的类catch,尽管这并不常见。

于 2013-07-31T17:25:43.863 回答
1

我什么都不知道。两个关键的事情是

  • 创建 Throwable 时
  • 当 getStackTrace() 被调用时,它会填充实际的数组(直到它被存储在堆外)
于 2013-07-31T16:58:13.370 回答