为什么Throwable.fillInStackTrace()方法是公共的?为什么有人使用它?


问题内容

我很好奇,为什么是方法fillInStackTracejava.lang.Throwable公开?

此方法从调用它的位置替换原始堆栈跟踪,从而删除了定位异常所需的信息。它可以用于混淆,但无需付出太多努力,因为新的堆栈跟踪将直接指向混淆代码。更好的方法是简单地隐藏异常或抛出新异常。

但是我找不到在现存的上调用此方法的 合理 理由Throwable。所以问题是:为什么这种方法是公开的?后面有什么意义吗?


问题答案:

原因之一是性能。抛出和捕获异常很便宜;昂贵的部分是填充堆栈跟踪。如果您fillInStackTrace()不执行任何操作,则创建异常也很便宜。

对于廉价的异常,您可以将异常用于流控制,这可以使代码在某些情况下更易读。在实现需要更高级的流控制的
JVM语言时,可以使用它们,并且在编写actors库时它们很有用。