Javaの例外は既知であるため、継承は、通常のクラスとは異なり、仕様を拡張するのではなく、仕様を絞り込むという要件に従います。
ブルース・エッケルの著書「Thinking in Java、4 ed。」は、例外の使用の制限について説明しています。 このコード例では、基本クラスからの継承と、インターフェイスの同時実装について説明します。どちらも、特異性は同じですが例外の仕様が異なるメソッドを持っています。 インターフェイスメソッドを実装する試みは、例外の仕様の拡張の防止を強調する基本クラスのメソッドを同時にオーバーライドする試みと交差します。 アイデアを伝える簡単なコード例:
class BaseBallException extends Exception{} class Foul extends BaseBallException{} class Strike extends BaseBallException{} abstract class Inning { //-----Methods---- public Inning() throws BaseBallException{} public void event() throws BaseBallException{} public abstract void atBat() throws Strike, Foul; } class StormException extends Exception{} class RainedOut extends StormException{} class PopFoul extends Foul{} interface Storm { public void event() throws RainedOut; } class StormyInning extends Inning implements Storm { //--------Methods----- public StormyInning() throws RainedOut, BaseBallException{} public StormyInning(String str) throws Foul, BaseBallException{} /** - Storm.event() throws RainedOut * Inning.event() throws BaseBallException RainedOut*/ //! public void event() throws RainedOut{} /** event() - * . * - */ public void event() {} public void atBat() throws PopFoul {} }
この例は、いくつかの興味深い組み合わせを行うことで、例外仕様の他のオプションで補足できます。
class BaseBallException extends Exception{} class Foul extends BaseBallException{} class Strike extends BaseBallException{} class LightStrike extends Strike{} class TwistedLightStrike extends LightStrike{} abstract class Inning { //-----Methods---- public Inning() throws BaseBallException{} public void event() throws BaseBallException{} public void event1() throws BaseBallException{} public void event2() {} public void event3() throws RainedOut{} public void event4() throws Strike{} public void event5() throws LightStrike{} } class StormException extends Exception{} class RainedOut extends StormException{} class Drizzle extends RainedOut{} class PopFoul extends Foul{} interface Storm { public void event() throws RainedOut; public void event1(); public void event2() throws RainedOut; public void event3() throws RainedOut; public void event4() throws LightStrike; public void event5() throws Strike; } class StormyInning extends Inning implements Storm { //--------Methods----- public StormyInning() throws RainedOut, BaseBallException{} public StormyInning(String str) throws Foul, BaseBallException{} /** - Storm.event() throws RainedOut * Inning.event() throws BaseBallException RainedOut*/ //! public void event() throws RainedOut{} /** - Storm.event() throws RainedOut c RainedOut * BaseBallException */ //! public void event() throws BaseBallException{} /** - * */ //! public void event() throws RainedOut, BaseBallException{} /** */ public void event() {} /** - Storm.event1() */ //! public void event1() throws BaseBallException {} /** - Storm.event1() * */ public void event1(){} /** - Inning.event() * */ //! public void event2() throws RainedOut{} /** . * .. * Storm.event2() throws RainedOut */ //public void event2(){} /** Storm.event3() throws RainedOut - * Storm.event3() throws RainedOut, * . */ //public void event3() throws RainedOut{} /** * */ //public void event3() throws Drizzle{} //public void event3() {} /** , event4()*/ /** event4() .. , * */ /** - Storm.event4()*/ //! public void event4() throws Strike{} /** - , - */ //public void event4() throws LightStrike{} /** - */ //public void event4() throws TwistedLightStrike{} public void event4() {} /** event4(), - * */ //! public void event5() throws Strike{} //public void event5() throws LightStrike{} //public void event5() throws TwistedLightStrike{} //public void event5() }
明らかに、次のプロジェクトのクラス階層を設計するときに、上記の制限と機能を考慮する必要はありません。