幸ログ

ナレッジを溜めていきます

Java 例外が定義されている抽象メソッドを実装する際の挙動をまとめてみた

概要

抽象クラスで定義されている抽象メソッドに例外処理としてthrowsでIOExceptionを定義しています。
この抽象クラスを継承した実装クラスでは、抽象メソッドで@Override定義する必要があります。
そのときの挙動を調べてみました。

ソースコード

抽象メソッドのthrowsで例外について定義されている場合、実装メソッドの書き方や挙動

最後のオーバーライドされたthrowOExceptionについて解説していきます。
コメントで書いてある通り、コンパイルエラーが発生します。
この理由はIOExceptionとExceptionとの関係性に原因があります。
勘がいい人はもうお気づきかと思いますが、IOExceptionの親クラス(スーパークラス)はExceptionです。

IOException ----------->   Exception
    (子)                      (親)

抽象メソッドで定義された例外クラスの親クラスはthrowsには書けません。

また互換性がない例外クラスもthrowsには書けません。 (例 SQLExceptionなど)

IOException    ----------->  
                             Exception
SQLException   ----------->
    (子)                        (親)

IOExceptionとSQLExceptionは継承の関係ではないためコンパイルエラーが起こる

抽象メソッドのthrowsで定義されている例外クラスから派生している子クラス(サブクラス)の場合は定義ができます。

FileNotFoundException   ----------->  IOException
        (子)                              (親)

一見抽象メソッドのthworsが意味ないと思わせて、本当は意味がありましたというオチです。

ちなみにthrowsじゃなくてtry catchで書く場合はthrowsには依存しないので、勘違いしないように気をつける必要があります。

調べてみるとまた新しい発見ができたので個人的には満足です。

ここ最近の感動

今までエディターはEmacsなどを触っていましたが、ここ最近EclipseなどIDEもいいなと思い始めました。
実際に使ってみると印象が変わってくるものですね。
適材適所でエディターを変えていくと個人的にはいい環境になるのではないでしょうか。
頭の切り替えが必要になりますが…。 個人的にEmacsJavaを書きたくないです…。