在java形容词中以-able结尾是接口Serializable
,Comparable
等等......那么为什么Throwable
是一个类?如果Throwable
是一个接口,那么异常处理会不会更容易? (编辑:例如,异常类不需要扩展Exception / RuntimeException。)
显然,现在改变它是不可能的。但它可以抽象吗?这不会避免throw new Throwable()
;
答案 0 :(得分:54)
以下是James Gosling如何解释他的决定:
Java开发人员连接程序:为什么
Throwable
不是接口?这个名字有点暗示它应该是。能够catch
获取类型,即try {} catch (<some interface or class>)
,而不仅仅是类。这将使Java [编程语言]更加灵活。James Gosling :
Throwable
和其他人不是接口的原因是因为我们决定,或者我很早就决定了。我决定我希望某个状态与每个被抛出的异常相关联。你不能用接口做到这一点;你只能用课程来做。那里的状态基本上是标准的。有一条消息,有一个快照,类似的东西 - 它总是在那里。而且,如果你使Throwable
成为一个界面,诱惑就是分配,使任何旧对象成为Throwable
的东西。从风格上来说,投掷一般物体可能是一个坏主意,你想抛出的东西确实应该是那些真正捕捉异常性质和发生的事情的异常事物。它们不仅仅是一般的数据结构。
答案 1 :(得分:17)
那么为什么Throwable是一个班级?
我可以想到两个原因:
异常处理不会更容易 如果Throwable是一个界面?
异常处理是一个难题,无论异常是类还是接口。我实际上怀疑如果他们不得不根据任意接口而不是类层次结构来命令它们的catch块,那么它会让Java程序员变得更难。
但它可以摘要吗?
理论上,是的。在实践中,没有。代码过多取决于能够创建Throwable实例以调用getStackTrace。
答案 2 :(得分:2)
什么是Cloneable?这不是一个正确的英文单词。
答案 3 :(得分:-3)
FYI
你不能使用
void doSomething() throws Serializable
但你可以使用泛型!
<T extends Exception & Serializable> doSomething() throws T
此致