为什么java.lang.Throwable是一个类?

2022-09-01 01:26:28

在java中,以-able结尾的形容词是接口,等等...那么为什么是类呢?如果是接口,异常处理不是更容易吗?(编辑:例如,异常类不需要扩展异常/运行时异常。SerializableComparableThrowableThrowable

显然,现在改变它是出了问题。但它能抽象化吗?这难道不能避免不良做法吗?throw new Throwable();


答案 1

以下是詹姆斯·高斯林(James Gosling)对他的决定的解释:

Java开发人员连接计划:为什么不是接口?这个名字有点暗示它应该是。能够用于类型,即类似 的东西,而不仅仅是类。这将使Java(编程语言)更加灵活。Throwablecatchtry {} catch (<some interface or class>)

James Gosling:那些家伙和其他那些人之所以不是接口,是因为我们决定了,或者我很早就决定了。我决定让一些状态与引发的每个异常相关联。你不能用接口做到这一点;你只能通过类来做到这一点。那里的状态基本上是标准的。有一条消息,有一个快照,诸如此类的东西 - 总是在那里。而且,如果你做了一个接口,那么诱惑就是分配,让任何旧对象成为一个东西。从风格上讲,抛出一般对象可能是一个坏主意,你想要抛出的东西真的应该是那些真正捕捉到异常性质和发生的事情的异常的东西。它们不仅仅是一般的数据结构。ThrowableThrowableThrowable

引用


答案 2

那么,为什么 Throwable 是一个类呢?

我能想到两个原因:

  1. 异常有状态。特别是消息、原因和堆栈跟踪。
  2. JVM 更容易实现高效的捕获块。类层次结构检查比接口检查便宜。

如果Stormable是一个接口,异常处理不是更容易吗?

异常处理是一个难题,无论异常是类还是接口。我实际上怀疑,如果Java程序员必须根据任意接口而不是类层次结构来订购他们的捕获块,这将使他们更加困难。

但它能抽象化吗?

从理论上讲,是的。实际上,没有。太多的代码依赖于能够创建一个 Throwable 实例来调用 getStackTrace。


推荐