2017-08-11 93 views
-4

众所周知,异常是默认类,异常类扩展为Throwable为什么异常是一个类而不是java中的接口?

我的问题是:为什么异常不是接口?

如果我们将尝试模拟异常类作为接口它会显示错误。我试了一下,但仍然无法找到相同的确切原因。 这是我尝试了代码:

接口:

package com.prg; 
import com.thed.util.CustomException ; 
public interface ExceptionInterface extends Throwable{ 
    public String sayHello() throws CustomException { 
     return null; 
    } 
} 

类别:

package com.prg; 
import com.thed.util.CustomException ; 
public class ExceptionCheck implements ExceptionInterface { 
    public String sayHello() { 
     return "Hey"; 
    } 
    public ExceptionCheck() throws CustomException { 
     System.out.println("hi"); 
    } 
    public static void main (String[] args) throws CustomException { 
     System.out.println("how are you"); 
     throw new ExceptionInterface({ 
      public String sayHello() { return "Hey"; } 
     }); 
    }   
    } 

如果我改变接口类则它没有显示预计异常。但为什么不接口这是我的问题?

+2

因为这是他们设计它的方式。 – EJP

回答

3

简单:因为有相当多的实施代码Throwable类,这是整个层次的基地内被发现。正如一条评论提醒我们的那样:还有很多异常相关代码支持到JVM的本地部分 - 如果代码必须处理实现Exception接口的任意对象,这可能非常困难。

中有,当你想给一个核心库元素给用户,其中包括实施使用接口是没有意义的。

(记住,默认的方法 - 又名方法体 - 在Java中是不允许直到Java8!)

除此之外:接口是允许不同的“意见”对课程有用。换句话说:整数例如可以看作可比较的。可能会出现这种情况,只有将Integer对象作为Comparable对象。但是真正的Integer的本质仍然是:它是一个表示一定范围的整数的类。

现在想想异常! public class Foo implements Exception有什么概念性的“意义”? Foo会如何“没有”那个异常观点?换句话说:例外在概念上也是“重要的”,足以成为不同的类别!

请记住,类和接口存在模型抽象。也许我只是没有足够的创造力 - 但我不知道如何可能是一个Foo对象 - 但是,如果需要的话也是一个例外。

最后:一个类是一个类,而一个接口是一个接口。那些是不同的东西。唯一允许的关系是:类扩展类,并且可以实现接口。接口只能扩展其他接口。这就是Java语言设计的的简单方法 - 而且你没有办法做你想要的代码。

+0

对我来说,你推理的后半部分是最有说服力的。 –

+0

@JiriTousek当然。我的大脑似乎像java JIT一样工作 - 它需要一个预热阶段。我的答案通常会在每次编辑时都会变得更好;-) – GhostCat

+0

对于异常工作,您需要一些无法在纯Java中执行的实现,最明显的是让您的堆栈跟踪(确定,使用Java 1.5,他们让我们可以访问那是通过Thread.getStackTrace(),但是一个类而不是接口的决定是在那之前做出的)。 –

相关问题