2015-10-07 5 views
5

メソッドのスローがそのシグネチャの一部になっているのはなぜですか?それを含めるのは奇妙に思えます。ここにはそれが途中である例があります。なぜメソッドシグネチャの一部がスローされる

@Overide 
public void foo() { 
    throw new UnsupportedOperationException(); 
} 

外部からこの方法を見たい場合は、サポートされていないことを知らずに使用する可能性があります。彼らはコードを実行しようとしたときにのみそれを学ぶだろう。

しかし、もしこのようなことができるのであれば、サポートされていないメソッドを見て、UnsupportedOperationExceptionがRuntimeExceptionを拡張していないとコンパイルエラーが発生することが分かります。 EDIT1:スローが署名の一部であるためオーバーライドが機能しないため、これは不可能です。

@Overide 
public void foo() throws UnsupportedOperationException { 
    throw new UnsupportedOperationException(); 
} 

この質問はによって低下し、それに答えるように私はそれで働く人々の一つせずに答えるのは難しいかもしれないことを知っているJavasの設計に関する、私は多分この質問は、それらに頼まれていることを期待していましたこれをなぜこのようにして理由を説明するのか明らかな理由があるかもしれません。

+3

ここにあなた自身の質問に答えているようですか?今あなた(そしてコンパイラ)はコードが例外をスローして処理する必要があることを知っています。 – Erik

+3

未チェックの例外および例外がスローされる条件は、javadocで文書化する必要があります。このパラダイムは、組み込みのJavaライブラリで使用され、複数の書籍で提案されています(例:名前を付けるのに有効なJava。 正しく記されているように、署名で宣言することは、コンパイラによって要求されていません。 – Danstahr

+0

あなたが質問しているのは、チェックされていない例外をスローするかどうかです。あなたのメソッドを開始するには、契約に従うべきであることを示す '@Override'を使います(抽象またはインタフェース)が、チェックされていない例外の場合はそうする必要はありません。 @danstahrが言及しているように、あなたがそれを投げることを選択したかどうかにかかわらず、必ずしも良いプラトスに従っているわけではありません。javadocに追加してください。 –

答えて

4

throws部分は、特定の事例であっても、上記の例外をスローする必要があることを示していません。それは、その機能が許可されていることだけを示しています。

throws UnsupportedOperationExceptionを含めると、その方法がサポートされていないことを意味するわけではありません。 UnsupportedOperationExceptionの外にはRuntimeExceptionなので、方法はthrowとにかく可能です。

ここでは、メソッドのシグネチャでそれを必要とするため、例外をチェックする機能に変わりはありません。コンパイラが、メソッドが指定された例外だけをスローできるかどうかを判断できるようにするには、呼び出されるメソッドがキャッチされない例外をスローできないと判断できる必要があります。

たとえば、メソッドのオーバーライドとは、スローされる可能性のある例外を追加できないことを意味します。そうでない場合は、そのメソッドを呼び出すメソッドが指定されたもの以外のものをスローできないことを確認できなくなります。 。それ以外の方法でも可能です(ただし、Javaがサポートしているかどうかはわかりません)。スローしない可能性のあるメソッドをオーバーライドします。例えばので

は:

class B { 
    int fubar(int) throws ExceptionA { 
    } 

    int frob(int) throws ExceptionA { 
     return fubar(int); 
    } 
} 

class D extends B { 
    int fubar(int) throws ExceptionB { 
    } 
} 

frobはおそらくthrowのみExceptionA、しかしthis.fubarそれは何か他のものがスローされている可能性を開くだろうが、fubarを呼び出すには、おそらく唯一のthrowExceptionAに定義されているように指定されています。だからD.fubarは無効な上書きです。this.fubarが実際にExceptionBをスローし、frobExceptionBをスローしないことをコンパイラが保証できない可能性があるからです。 checked例外と unchecked例外:

2

Javaの例外の二種類があります。

チェックされていない例外はサブクラスRuntimeExceptionであり、スロー宣言を追加する必要はありません。他のすべての例外は、try/catchステートメントまたはスロー宣言を使用してメソッド本体で処理する必要があります。

チェックされていない例外の例:IllegalArgumentException:不正な引数でメソッドが呼び出されたことを時々通知するために使用されます。スローは必要ありません。

チェック例外の例:IOException java.ioパッケージのいくつかのメソッドがスローする可能性があります。 try/catchまたはaddを使用してメソッド宣言にIOExceptionをスローし、例外処理をメソッド呼び出し側に委譲します。

関連する問題