- ベストアンサー
Exceptionクラスの継承について
Exceptionクラスを継承しているExceptionMがありますが、その中にsuper(message)というものがあります。 これは、スーパークラスのExceptionがmessageという変数を引数で受けることができるメソッドを使用していることは分かりますが、実際何を行っているのでしょうか? そして、この処理によって何を得ているのでしょうか? あと、try{のなかにtry{という変な記述していますが、問題でそうかかれていただけなので気にしないでください。 問題箇所 class ExceptionM extends Exception{ public ExceptionM(String message){ super(message); } } 全ソース class ExceptionSubclassQuestion{ public static void main(String args[]){ a(); } static void a(){ try{ try{ throw new ExceptionM("M"); }catch(ExceptionN e){ System.out.println("lnner catch"); e.printStackTrace(); } }catch(ExceptionM e){ System.out.println("Quter catch"); e.printStackTrace(); } } } class ExceptionM extends Exception{ public ExceptionM(String message){ super(message); } } class ExceptionN extends ExceptionM{ public ExceptionN(String message){ super(message); } }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
スーパークラスExceptionのコンストラクタを呼んで初期化をしています。 試しにsuper(message)を消して実行してみると、エラーが起きたときにe.printStackTrace()の出力が少なくなります。 ExceptionMはExceptionを継承しているので、ExceptionクラスのメソッドであるprintStackTraceもメソッドとして持っています。 しかし、ExceptionMクラスではprintStackTraceメソッドをオーバーライド(上書き定義)していないので、ExceptionMクラスのprintStackTraceメソッドを呼び出した場合、スーパークラスで定義されているprintStackTraceが実行されます。 printStackTraceメソッドはコンストラクタで与えられた詳細情報(message)を出力するので、super(message)を呼び出さないとExceptionクラスには詳細情報が与えられず、当然e.printStackTrace()を実行しても詳細情報が表示されなくなるというわけです。
その他の回答 (2)
- anmochi
- ベストアンサー率65% (1332/2045)
> super(message); 単に親クラス(Exception)のコンストラクタを呼び出しているだけだと思うが・・・・それだけじゃ不満なのか? それならJavaコアコンポーネントのソースを見てみたら良い。 今ちらっと見てみただけなのだが、Exceptionクラスのコンストラクタは単にsuper()を呼び出しているだけだ。で、Exceptionクラスの親はThrowableクラスのようで、このクラスはSerializableインタフェースを実装して親は居ない(正確にはjava.lang.Objectが親)ようだな。で、こいつのコンストラクタはfillInStackTraceだかなんだか、名前を見た感じスタックの状態を保持するようなメソッドを呼び出していた。 結論:super()は親クラスのコンストラクタを呼ぶもので、Exceptionクラスは最終的にスタックトレースを得ているようだ。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
スーパークラスのコンストラクタを呼び出しています。
お礼
回答ありがとうございます。 ややこしいですが、とりあえず何とか理解できました。