2017-08-11 7 views
-4

例外として、デフォルトではクラスがあり、例外クラスはThrowableです。なぜexceptionはクラスであり、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クラス内で発見される実装コードのかなり多くがありますので。また、1つのコメントが私たちに思い出させるように:例外の多くは、のように、をJVMのネイティブ部分にバックアップしています。例外コードを実装する任意のオブジェクトを処理する必要があるのはおそらく非常に難しいでしょう。

あなたは実装を含んユーザーにコアライブラリ要素を与えたい時にインターフェースを使用しても意味がありません。

(デフォルトの方法があることに注意してください - メソッド本体別名が - Java8までJavaで許されなかった!)その向こう

インタフェースは、クラスの異なる「ビュー」を許可するのに有用です。換言すれば、整数は例えばと見なすことができる。にはIntegerオブジェクトをComparableとして扱うことができます。しかし、真実本質的なの性質はまだあります:それはある範囲の整数を表すクラスです。

ここで例外について考えてみましょう。 public class Foo implements Exceptionの概念上の「センス」は何ですか? Fooはその例外ビューを「無」にすることは何でしょうか?言い換えれば、例外は概念的には「重要」なので、別個のクラスとして立つことができます!

の抽象度をモデル化するためのクラスとインターフェイスが存在することに注意してください。たぶん、私はちょうど十分に創造的ではありません - しかし、何かが何かがFooオブジェクトであるかもしれないかわかりませんが、必要ならば例外です。

最後に、クラスはクラスであり、インターフェイスはインターフェイスです。それらは異なるものです。そして、許可される唯一の関係は、クラスがクラスを拡張し、インターフェイスを実装できることです。インタフェースは、他のインタフェースのみを拡張することができます。これは単にJava言語がとどのように設計されているかを示しています。あなたがしたいことを暗示するようなことはできません。

+0

私には、あなたの推論の後半部分が最も説得力があります。 –

+0

@JiriTousek確かに。私の脳はJava JITのように動作しているようです。ウォーミングアップ段階が必要です。 – GhostCat

+0

例外が動作するためには、純粋なJavaでは実行できない実装が必要です。特に、スタックトレースを取得する必要があります(ok、Java 1.5では、それはThread.getStackTrace()を介して、インターフェイスの代わりにクラスの決定がそれよりずっと前に行われた)。 –

関連する問題