過去の日記

2005-09-01 ヘロヘロ〜 [長年日記]

サブクラスのメソッドでの例外 [hatena][tech][java]

JAVAに関して
質問があります。
ある書籍に、「サブクラスのメソッドがスローする例外は、スーパークラスのメソッドがスローする例外と同じか、そのサブクラスにする」とあります。

この、「そのサブクラスにする」という所が、サブクラスAのメソッドがスローする例外を、スーパークラスのサブクラスBにする、と解釈(?)しましたが、よく意味も分からないし、なぜそうするのかも分かりません。
http://www.hatena.ne.jp/1125565658

ここは逆に「制限事項です」という口調で説明してくれた方が判りやすかったハズ。
「サブクラスのメソッドがスローする例外は、『スーパークラスのメソッドがスローする例外とそのサブクラス』以外のものにしてはいけない」と考えるべき。

+--java.io.IOException
      |
      +--java.io.ObjectStreamException
            |
            +--java.io.OptionalDataException

という階層になっているExceptionがある。


Aクラスのhogeメソッドが

void hoge() throws ObjectStreamException

で宣言されていたとする。

A a = new ???();

try {
  a.hoge();
}
catch (ObjectStreamException ex) {
  /*何か適切な処置を*/
}

というソースを書く必要がでてくる。


AのサブクラスBのhogeメソッドが

void hoge() throws OptionalDataException

と宣言されていたとしよう。

A a = new B();

try {
  a.hoge();
}
catch (ObjectStreamException ex) {
  /*何か適切な処置を*/
}

という使い方になる。
OptionalDataException は ObjectStreamException のサブクラスだから、このソースで、catch (ObjectStreamException ex) {} の中の処理に問題が生じることはないはずだ。


AのサブクラスCのhogeメソッドが

void hoge() throws IOException

と宣言されていたとしよう。

A a = new C();

try {
  a.hoge();
}
catch (ObjectStreamException ex) {
  /*何か適切な処置を*/
}

というソースになるわけだけど、/*何か適切な処置を*/の部分は、発生した例外が ObjectStreamException だと思って処置を書いている。
ところが、発生するかもしれいない例外は、IOException(のサブクラス)なわけで、 ObjectStreamException だと思って処置を書いたのでは駄目かもしれない、ということになる。
そのためコンパイルレベルで、サブクラスのメソッドのthrows句に書ける例外は、オーバーライドしたスーパークラスのメソッドのthrows句によって制限されている方が望ましい、ということになる。そういうことを説明した文なわけだ。


もっと極端な例だと、

void hoge() throws java.net.ProtocolException

なんてあったらもうどうしていいか判らない。


引き合いに出してるExceptionの例が悪いので上手く伝わらないかも。
もっと上手い例が無いかな?

エレメンタルジェレイド 同契 SOUND SIDE 買った [music]

エレメンタルジェレイド 同契 Re-No:1 SOUND-SIDE

  • アーティスト: 斉藤恒芳,梶浦由記,梶浦由記
  • 出版社/メーカー: ビクターエンタテインメント
  • 発売: 2005-08-24
  • ASIN: B000A38QUS
  • メディア: CD
  • amazon.co.jp詳細へ

外箱不要。
よくわかんないんだけどなんでオリジナルサウンドトラック2じゃないのだろう?


コーラスを重ねていくいつもの技法の曲は、梶浦由記だなぁ、と思って聞いた。
弦を重ねて作っている曲は新鮮味があってそっちの方が印象的だった。

グランディアII始めた [game]

IIIじゃないよ。


そういえば、グランディアIIが出た時にグランディアを再開した記憶もあるのだが、気のせいではないだろう。

風邪引いた [etc]

だるいなぁと思って寝ていたら体の節々が痛くなってきてこりゃおかしいと思って熱を測ったら38.0度あった。
というのが火曜日のこと。


今週はほぼメールチェック(Amazonマーケットプレイスで売れた物がないかどうか)ぐらいでしかPC立ち上げてない。