2005-09-01 ヘロヘロ〜 [長年日記]
■サブクラスのメソッドでの例外
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 買った
外箱不要。
よくわかんないんだけどなんでオリジナルサウンドトラック2じゃないのだろう?
コーラスを重ねていくいつもの技法の曲は、梶浦由記だなぁ、と思って聞いた。
弦を重ねて作っている曲は新鮮味があってそっちの方が印象的だった。
■風邪引いた
だるいなぁと思って寝ていたら体の節々が痛くなってきてこりゃおかしいと思って熱を測ったら38.0度あった。
というのが火曜日のこと。
今週はほぼメールチェック(Amazonマーケットプレイスで売れた物がないかどうか)ぐらいでしかPC立ち上げてない。