• ベストアンサー

スーパークラスについて

下記のソースコードについて、質問がありますので記載致しました。 class TooYoungException extends Exception { TooYoungException(String message) { ------------------------ super(message); ------------------------ } } class AdultMember{ private String name; private int age; void setAge(int age) throws TooYoungException{ if (age > 18) { this.age = age; } else { throw new TooYoungException("年齢が低すぎます:" + age); } } int getAge() { return this.age; } } class Test{ public static void main(String args []) { AdultMember adm = new AdultMember(); try { adm.setAge(Integer.parseInt(args[0])); System.out.println("年齢を設定しました"); }catch(TooYoungException tme) { System.out.println(tme.getMessage()); } } } [質問内容] -----でかこってある部分の super(message) になりますが、 何故、この部分に throw new TooYoungException("年齢が低すぎます:" + age); の("")の文字が入り、文字が表示されることになるのでしょうか? とりわけ、superが指し示しているもの(Exceptionがスーパークラスに なると思われますが)はどれになるのでしょうか。 理解しきれていない部分が多数ありますが、ご教授の程お願い致します。

  • KGM
  • お礼率44% (66/148)
  • Java
  • 回答数4
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

特にExceptionのコンストラクタなんて意識したことが無かったので、いい機会なので調べてみました。 Java 1.4 を逆コンパイルしてソースを見てみました。 public Exception(String message) { super(message); } まぁつまりExceptionのスーパークラスである、Throwableのコンストラクタを呼び出していますね。 では、Throwableでは? public Throwable(String message) { fillInStackTrace(); detailMessage = message; } フィールドであるdetailMessageに引数messageを単純にセットしていました。 同時にThrowableのメソッドgetMessage()は public String getMessage() { return detailMessage; } でした。ちょっと違いますがKGMさんの想像していたこととほぼ同じようなものです。(ただしdetailMessageはprivateでした。) : : まぁ勉強のためというのならわかりますが、そこまで内部の処理を理解しなくてもよいのでは?と思います。それもオブジェクト指向のよいところでしょうから。Java API Documentを参考にしながら使うことでもいいのではないでしょうか?

KGM
質問者

補足

なるほどです。 ちょっと、考えすぎてしまいました。。。 superだけで、どう機能するのかさっぱりわかりませんでしたので。。。 非常に助かりました。

その他の回答 (3)

回答No.4

ご参考までに。 Javaで提供されているクラスのソースなら、インストール時に選択すれば、src.zip(だったかな?)がインストールできますよ。 それを解凍すれば、OKです。 ただし、コメントは全部は英語ですが…。 日本語版JavaDocと合わせて見れば、勉強になると思います。

KGM
質問者

お礼

なるほどです。 英語の勉強にもなりますね^^ ありがとうございます。

回答No.2

No1の方がコンストラクタで構築、といっていますよね。 メソッドではなくコンストラクタです。 コンストラクタとはインスタンスを生成する際に必ず呼び出されるものです。つまり、TooYoungExceptionのコンストラクタ内でsuperクラスであるException のコンストラクタを呼び出しているのです。

KGM
質問者

補足

superはExcepionのコンストラクタを呼び出しているのですね^^ つまり、Excepionのコンストラクタを呼び出したことで、 messageに値が代入されたことになるのですか??? super(message)の部分では super.message = message という処理が行なわれていることになるのでしょうか? 上記のような、処理がなければString型の変数messageに値が 代入されないと思われます。 もう少しで理解できるところまで到達しておりますので、 お手数ですがご教授の程、お願い致します。

回答No.1

Exceptionクラスのコンストラクタ Exception(String message) 指定された詳細メッセージを使用して、新規例外を構築します。 です。 ちなみに tme.getMessage() は、更に親のクラスであるThrowableクラスのメソッド getMessage() この Throwable オブジェクトの詳細メッセージ文字列を返します。 です。

KGM
質問者

お礼

ご丁寧な説明をしていただき、まことにありがとうございます。 前半のコンストラクタについて、まだ理解度が足りなかったようです。 書き込みありがとうございます!!

KGM
質問者

補足

super(message)にて superはExceptionクラスのどのメソッドを使って 新規例外を構築しているのでしょうか?? 誠に申し訳ございませんが、再度ご教授の程お願い致します。

関連するQ&A

  • クラス名を変えるとコンパイルが通らない

    interface HINA { void write(String str, int age); } class super_class { String name; int age; public void write(String str, int age){ System.out.println(str + "\t" + age); } super_class(String name, int age) { this.name = name; this.age = age; } } class sub_class extends super_class implements HINA { public void write(String str , int age) { System.out.println(str + "\t" + age); } sub_class(String str , int age) { super(str , age); } } public class test3 { public static void main(String[] args) { super_class naru = new super_class("成瀬川なる", 17); super_class shinobu = new sub_class("前原しのぶ", 13); sub_class motoko = new sub_class("青山素子", 15); if (naru instanceof HINA) naru.write(naru.name, naru.age); if (shinobu instanceof HINA) shinobu.write(shinobu.name, shinobu.age); if (motoko instanceof HINA) motoko.write(motoko.name, motoko.age); } } これのsuper_classをOyaに、sub_classをKoにするとコンパイルエラーになります。 何故なんでしょう。 分かる方がいましたら、教えて下さい。 どうぞ宜しくお願い致します。 それと見づらくてどうもすいません。

    • ベストアンサー
    • Java
  • 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); } }

    • ベストアンサー
    • Java
  • 例外処理(throws Exception)について

    Javaでインスタンスを作るときの例外処理を学んでいます。 ageクラス(属性は、private int ageのみ)のt1オブジェクトを作るときに、年齢が0歳以上100歳以下ならt1が作られ、それ以外の場合はエラーを返すようにしたいと思いますが、うまくいきません。 そのため、仮に50歳でオブジェクトを作ってから、年齢を150にした場合を考えましたが、Sample クラスのt1.setAge(150);のところで、「処理されない例外の形」というエラーが返っております。 改善点につきまして、ご教示いただければ幸いです。 ■■ageクラス■■ package ex1; public class age { //***属性***// private int age; //***コンストラクタ***// public age(int data){ this.age= data; } //**メソッド**// public int getAge(){ return age; } public void setAge(int age)throws Exception{ //**年齢が0から100までかどうか**/ if((age > 0) && (age <100)){ this.age = age; } else{ throw new Exception("無効です"); } } } ■■Sample クラス■■ package ex1; public class Sample { public static void main(String[] args) { age t1; t1 = new age(50); t1.setAge(150); System.out.println("t1_age="+ t1.getAge()); } }

  • クラスの拡張について

    Teacher クラスを変更し、newTeacher()の時は、名前「TARO」、年齢「25」、科目「国語」で初期化し、newTeacher(名前、年齢、科目)のときはそれぞれのパラメータでオブジェクトを作るようにしたい。 Person クラスのコンストラクタが使ってもかまわない という問題で //ClassRoom3.java class Person{ String name; int age; Person(String name,int age){ this.name = name; this.age = age; } void print(){ System.out.println("[Name]"+name); System.out.println("[age]"+age); } } class Teacher extends Person{ String subject; void print(){ System.out.println("私は"+name+" といいます。"); System.out.println("年齢は"+age+" 才です。"); System.out.println(subject+" を教えています。"); } } class ClassRoom3{ public static void main(String args[]){ Teacher obj1 = new Teacher(); Teacher obj2 = new Teacher("JIRO",27,"算数"); obj1.print(); System.out.println(); obj2.print(); } } /* 実行例 >java ClassRoom3 私は TARO といいます。 年齢は 25 才です。 国語 を教えています。 私は JIRO といいます。 年齢は 27 才です。 算数 を教えています。 */ という出力結果をだしたいのですが、なんどもやっても失敗してしまい。なかなかできません。 どう直したらよいのですか?

  • ArrayListを使ったクラスの作成の仕方

    次のプログラム、どこが間違っているのでしょうか? コンパイルは通るのですが、実行しようとすると ずら~っとエラーが出てしまいます。 (例)at java.lang.ClassLoader.defineClass1(Native Method) at java.security.SecureClassLader.defineClass..... at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) ********************************************************** package siryou; import java.util.ArrayList; import java.io.*; class Info { private String name; private String age; private String nationality; public void setName(String nm) { name = nm; } public void setAge(String a) { age = a; } public void setNationality(String nt) { nationality = nt; } public void show(String j) { System.out.println("「名前=" + name + "」"); System.out.println("「年齢=" + age + "」"); System.out.println("「国籍=" + nationality + "」"); } } class Kojinjyoho02 { public static void main(String args[])throws IOException { System.out.println("何回入力しますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); Info in = new Info(); ArrayList list = new ArrayList(); for(int i =0; i < res; i++){ System.out.println("名前は?"); str = br.readLine(); in.setName(str); System.out.println("年齢は?"); str = br.readLine(); in.setAge(str); System.out.println("国籍は?"); str = br.readLine(); in.setNationality(str); list.add(in); } for(int j=0; j < list.size(); j++){ String jyoho = (String)list.get(j); in.show(jyoho); } } }

    • ベストアンサー
    • Java
  • java 入力命令

    以下うまくどうさしません、教えてください。 public class Main { public static void main(String[] args){ System.out.println("名前"); String name = new java.util.Scanner(System.in) .nextLine(); System.out.println("年齢"); int age = new java.util.Scanner(System.in) .nextInt(); System.out.println (age + name); } }

  • Javaのプログラムについて教えて下さい

    //Sample.java class Sample void methodA(int temp) if(temp == 0) String str = new String("Exception"); Integer.parseInt(str); else if(temp == 1) int[] array = new int[temp]; else Exception exc = new Exception(); throw exc; //SampleMain.java class ExceptionMain public static void main(string[] args) Sample sam = new Sample(); Int temp = Integer.parseInt(args[0]); Sam.method(temp); } } このプログラムの場合、ExceptionMainに新たにコードを加えて、コマンドライン引数が0,1,その他の場合に例外メッセージを出力するプログラムを教えて下さい。

    • ベストアンサー
    • Java
  • 内部クラスのインスタンスを動的に取得したい

    class test {   public test(String str){     try{       Class c = Class.forName("test$TESTSUB" + str);       c.newInstance();  // ココでエラー     }catch(Exception e){       e.printStackTrace();     }   }   public static void main(String[] args){     new test(args[0]);   }   class TESTSUB1 {     public TESTSUB1(){       System.out.println("# " + toString());     }   }   class TESTSUB2 {     public TESTSUB2(){       System.out.println("# " + toString());     }   } } 上記のようなコードにより、内部クラスのインスタンスを 動的に得たいと思っていますが、エラーとなってしまいます。 エラー回避方法、または他にいい方法がありましたら、 ご教示のほどよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 抽象クラス について

    obj.write();した時 class super1 の write()が呼ばれ その後 class HINA の write()が呼ばるのか? 直接 class HINA の write()が呼ばるのか? どう呼び出してるのか 教えてください abstract class super1 { abstract void write(); } class HINA extends super1{ void write() { System.out.println( "LOVE HINA" ); } } class test { public static void main( String args[] ) { super1 obj = new HINA(); obj.write(); } } }

  • 他ファイルで定義された自作例外の受け方

    他ファイルで定義された自作例外の投げ方と受け方を 教えて下さい。 // ------ Class.java ---> import java.io.*; public class Class1 {  static Class2 oClass2;  public static void main (String[] args)  {   try {    oClass2 = new Class2();    System.out.println("main");    oClass2.vfFunc();   } catch (MyException e) {    System.out.println("catch MyException");   } catch (Exception e) {    System.out.println("catch Exception");   }  } } // <------ Class1.java --- // ------ Class2.java ---> import java.io.*; public class Class2 {  public Class2()  {   System.out.println("Class2コンストラクタ");  }  public void vfFunc()  {   System.out.println("Class2 vfFunc");   throw new MyException();  }  public class MyException extends Exception  {   public MyException()   {    System.out.println("MyException");   }  } } //<------ Class2.java ---

    • ベストアンサー
    • Java

専門家に質問してみよう