ExceptionTest.java
class ExceptionTest {
public static void main (String[] args) {
ExceptionTest instance = new ExceptionTest();
instance.doTest();
}
public void doTest () {
Exception2 ex2 = new Exception2(new NullPointerException("ヌルポです。"));
System.out.println(ex2.getException().getMessage());//(1)「ヌルポです。」が出力
System.out.println(ex2.getMessage()); //(2)「null」になる
}
}
Exception2.java
class Exception2 extends Exception {
public Exception ex;
public Exception2 (Exception ex) {
this.ex = ex;
}
public Exception getException () {
return this.ex;
}
}
getMessage()は継承した同じフィールドの値(message?)を返すはずですが、
(2)はなぜ(1)と同じにならないのでしょうか。
new Exception(String)
と
new Exception2(Exception)
は処理が異なります。
「ヌルポ」と表示されるのは、new した NullPointerException のインスタンスの
getMessage を利用しているからです。
(NullPointerException は String["ヌルポです。"] を引数にインスタンス化してますね)
他方、Exception2は 独自に定義した Exception2型にのみ定義されたException型の
インスタンス変数に値を設定しているだけです。
よって、Exception#getMessage を呼び出しても 値が設定されていないため、
null が戻ります。
Exception2 ex2 = new Exception2(new NullPointerException("ヌルポです。"));
この時点でex2はException(の派生クラス)です。
で、Exception2の実装を見てみるとException2はException(の派生クラス)を一つ持っています。
ということは、上のコードの時点でException(の派生クラス)が2つ出来ています。
Exception2がNullPointerExceptionを持っている状態になっているわけです。
> getMessage()は継承した同じフィールドの値(message?)を返すはずですが、
> (2)はなぜ(1)と同じにならないのでしょうか。
"ヌルポです。"というメッセージはException2が持っているExceptionのメッセージに設定しています。
Exception2自体にはメッセージは設定されていません。
ですからex2.getMessage()はnullなのです。
理解できました。
継承するのは、あくまでインスタンスが作られる前までで、それぞれのインスタンス
new NullPointerException("ヌルポです。")
new Exception2()
が作られてからは、messageフィールドは別の値を持つという事を理解できていませんでした。
ありがとうございました!
理解できました。
ありがとうございました!