在 Java 中没有堆栈跟踪的异常

2022-08-31 15:41:21

这可能是一个非常幼稚的问题。

我曾经认为Java中的a总是包含堆栈跟踪。这是正确的吗?Throwable

现在看起来我捕获异常而不进行堆栈跟踪。这有意义吗?是否可以在没有堆栈跟踪的情况下捕获异常?


答案 1

可以在Java中捕获一个可抛出对象,而无需堆栈跟踪:

Throwable(String message, Throwable cause, boolean enableSuppression,boolean writableStackTrace) 

构造一个新的可抛出文件,其中包含指定的详细信息消息、原因、抑制启用或禁用以及启用或禁用可写堆栈跟踪

public Throwable fillInStackTrace()

填充执行堆栈跟踪。此方法在此可抛出对象中记录有关当前线程的堆栈帧的当前状态的信息。

如果此 Throwable 的堆栈跟踪不可写,则调用此方法不起作用

http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html


答案 2

对于 Java 6:

由于Java 6没有构造函数,我们可以使用以下技术(从Scala借来的,从Java异常有多慢?Throwable(String message, Throwable cause, boolean enableSuppression,boolean writableStackTrace))

class NoStackTraceRuntimeException extends RuntimeException {
    @Override
    public synchronized Throwable fillInStackTrace() {
        return this;
    }
}

用法相同:,或者是子类型。throw new NoStackTraceRuntimeException ()

我们也可以通过扩展来做同样的事情:Throwable

class NoStackTraceThrowable extends Throwable {
    @Override
    public synchronized Throwable fillInStackTrace() {
        return this;
    }
}

但是,一个小问题是,您不能再使用这些异常,因为这不是 的子类型,而应该捕获或它的子类型。catchExceptionExceptionNoStackTraceThrowable

更新:有关不同用例中性能的一些有趣统计数据,请查看此SO问题


推荐