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

时间:2010-05-23 00:45:54

标签: java exception-handling class-design

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

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

的不良做法

4 个答案:

答案 0 :(得分:54)

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

  

Java开发人员连接程序:为什么Throwable不是接口?这个名字有点暗示它应该是。能够catch获取类型,即try {} catch (<some interface or class>),而不仅仅是类。这将使Java [编程语言]更加灵活。

     

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

参考

答案 1 :(得分:17)

  

那么为什么Throwable是一个班级?

我可以想到两个原因:

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

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

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

      

    但它可以摘要吗?

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

答案 2 :(得分:2)

好的Hashtable也是一个具体的课程!可以哈希的东西。

什么是Cloneable?这不是一个正确的英文单词。

答案 3 :(得分:-3)

FYI

你不能使用

void doSomething() throws Serializable

但你可以使用泛型!

<T extends Exception & Serializable> doSomething() throws T

此致