Java 抛出异常是否会改变其状态?

Java 抛出异常是否会改变其状态?,java,exception,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(

我做了一些简单的实验,比如:

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)]
并获得如下输出:

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

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

  • 创建可丢弃项时
  • 调用getStackTrace()时,它将填充实际数组(在此之前,它存储在堆外)

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

要获得完整的堆栈跟踪,并且在打印错误时可能会获得更多的信息,您只需执行
System.out.println(e)
System.out.println(“错误声明”,e)并且它应该打印整个stacktrace。只需一个提示。
printStackTrace
使用
System.err
而不是
System.out
。要使输出看起来像预期的那样,请使用
printStacktrace(System.out)
。请注意,在Java中,异常堆栈跟踪是在创建异常时进行的,而不是在抛出异常时进行的。您可以捕获异常并重试一次或两次,序列化它以查看是否有任何更改…实际上,Throwable有几种方法可以改变它。最值得注意的是fillInStackTrace,它覆盖了创建Throwable时捕获的堆栈跟踪
fillInStackTrace
,正如我提到的异常,确实使
可丢弃的
可变,但是大多数异常类没有其他的变量,如果
writableStackTrace
false
,那么该方法实际上可能不会修改堆栈跟踪。