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

mdm*_*dma 38 java class-design exception-handling

在-able结尾的接口java的形容词Serializable,Comparable等等......那么,为什么是Throwable一类?如果Throwable是接口,异常处理会不会更容易?(编辑:例如,异常类不需要扩展Exception/RuntimeException.)

显然,现在改变它是不可能的.但它可以抽象吗?这不会避免不良做法throw new Throwable();

pol*_*nts 56

以下是James Gosling解释他的决定:

Java Developer Connection Program:为什么Throwable不是接口?这个名字有点暗示它应该是.能够catch为类型,即类似的东西try {} catch (<some interface or class>),而不仅仅是类.这将使Java [编程语言]更加灵活.

James Gosling:这些Throwable人和其他人不是接口的原因是因为我们决定,或者我很早就决定了.我决定我希望某个状态与每个被抛出的异常相关联.你不能用接口做到这一点; 你只能用课程来做.那里的状态基本上是标准的.有一条消息,有一个快照,类似的东西 - 它总是在那里.而且,如果你创建Throwable一个界面,诱惑就是分配,使任何旧的对象成为一个Throwable事情.从风格上来说,投掷一般物体可能是一个坏主意,你想抛出的东西确实应该是那些真正捕捉异常性质和发生的事情的异常事物.它们不仅仅是一般的数据结构.

参考

  • 好吧,+1为我给出的答案辩护.不错的Google-fu :-). (3认同)

Bre*_*ail 17

那么为什么Throwable是一堂课呢?

我可以想到两个原因:

  1. 例外有州.特别是消息,原因和堆栈跟踪.
  2. JVM更容易实现高效的catch块.类层次结构检查比接口检查便宜.

如果Throwable是一个界面,异常处理会不会更容易?

无论异常是类还是接口,异常处理都是一个难题.我实际上怀疑如果他们必须根据任意接口而不是类层次结构来命令它们的catch块,它会使Java程序员更难.

但它可以抽象吗?

从理论上讲,是的.在实践中,没有.太多的代码取决于能够创建Throwable的实例以调用getStackTrace.

  • 它来自实现VM的个人经验(尽管不一定是JVM).instanceofClass可以由VM实现,如"o.getClass().hierarchy [c.hierarchyDepth] == c"(带边界检查).instanceofInterface必须使用某种表或循环(可能带有内联缓存)来实现,因为它需要考虑层次结构中所有类实现的所有接口(包括超级接口). (2认同)