以下のJavaに関してです。

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)と同じにならないのでしょうか。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2008/09/21 00:04:47
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:ZAS No.1

回答回数10ベストアンサー獲得回数0

ポイント40pt

new Exception(String)

new Exception2(Exception)

は処理が異なります。

「ヌルポ」と表示されるのは、new した NullPointerException のインスタンスの

getMessage を利用しているからです。

(NullPointerException は String["ヌルポです。"] を引数にインスタンス化してますね)

他方、Exception2は 独自に定義した Exception2型にのみ定義されたException型の

インスタンス変数に値を設定しているだけです。

よって、Exception#getMessage を呼び出しても 値が設定されていないため、

null が戻ります。

id:kurokumi

理解できました。

ありがとうございました!

2008/09/21 00:03:14
id:yo-kun No.2

回答回数220ベストアンサー獲得回数30

ポイント40pt

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なのです。

id:kurokumi

理解できました。

継承するのは、あくまでインスタンスが作られる前までで、それぞれのインスタンス

new NullPointerException("ヌルポです。")

new Exception2()

が作られてからは、messageフィールドは別の値を持つという事を理解できていませんでした。

ありがとうございました!

2008/09/21 00:03:12

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません