• ベストアンサー

エラーメッセージ(初歩)

こんにちは。早速ですが質問させていただきます。 javaの課題をやっているのですが、どうしてもエラーメッセージ を解決できません。 まずプログラムですが… class Dog1{ private String name; private int age; public Dog1(String n){ name = n; } public Dog1(int a){ age = a; } public void getName(){ System.out.print(name); } public void getAge(){ System.out.print(age); } } class Ex45{ public static void main(String args[]){ Dog1 d = new Dog1(); d.setName("ケイ"); d.setAge(17); System.out.println(d.getName() + "は" + d.getAge() + "才の犬です。"); } } このようなプログラムなのですが、 学校から出された課題なのでいくつか条件があります。 1.main文はそのまま使用する(main文は課題プリントを丸写しの状態です。) 2.Dog1クラスを作成し、Dogクラスの変数はprivate変数とする 以上です。 このような条件でプログラムを考えては見たもののバグが出てしまい 一向に問題が解決しません。 バグの箇所はmain文のd.getName()あたり(void型は使用できない)とのメッセージです。 どなたかよろしくお願いします。

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

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

こんにちは。himajin100000さんの書いているようなプログラムにすれば問題ないわけですが、if070033さんの場合、具体的に何が問題かというと、mainメソッド内部のprintlnメソッドの中で使っているd.getName()とd.getAge()に戻り値としてvoidが指定されていることです。 メソッドは、voidが指定してあると、単に処理を実行するだけで終わります。なので、メソッドを実行した後はプログラム的には何も残らないので、表示しようと思っても表示するものがないからエラーになるのです。 それに対して、Stringなどの型を戻り値に指定して、return文で返すようにすると、メソッド実行後、そこにはString型の値が残るので、表示可能となるわけです。 言葉の説明じゃ分かりにくいかなあ・・・。なかなか上手く説明できなくてすいません・・・。

noname#39315
質問者

お礼

お礼のお返事が遅くなってすいませんでした。 d.getName()という命令は戻り値を持つメソッドを呼び出している だけの処理だということがよくわかりました。 仰っている事がよく理解できました。 ご回答ありがとうございました!

その他の回答 (1)

回答No.1

class Dog1{ /* 個人的な見易さ都合で大文字で始めてる。 以後統一すれば何でもよい。 */ private String Name; private int Age; public Dog1(){ /* mainで呼ばれているのは引数なしコンストラクタ */ } public Dog1(String n){ /* コンストラクタのオーバーロード */ Name = n; } public Dog1(int a){ /* コンストラクタのオーバーロード */ Age = a; } /* setterもきちんと定義。setterはとりえあえず戻り値なし */ public void setName(String paramName){ Name = paramName; } public void setAge(int paramAge){ Age = paramAge; } public String getName(){ /* 戻り値を指定 */ return Name; /* returnで返す */ } public int getAge(){ /* 同上*/ return Age; } } /* 当方の都合でクラス名を変えている。一応public なクラス*/ public class Q3263424{ public static void main(String args[]){ Dog1 d = new Dog1(); d.setName("ケイ"); d.setAge(17); System.out.println(d.getName() + "は" + Integer.toString(d.getAge()) + "才の犬です。"); } }

noname#39315
質問者

補足

私から質問しておいて、お返事が遅くなってすいません。 ご回答ありがとうございました。 コンストラクタとオーバーロードの概念をその後一通り勉強してみた のですが、ひとつわからない部分があります。 それは… /* setterもきちんと定義。setterはとりえあえず戻り値なし */ public void setName(String paramName){ Name = paramName; } public void setAge(int paramAge){ Age = paramAge; } このプログラムの部分です。このプログラムがいまいち理解できません。この部分はどこのプログラムから呼び出されてどのような働きをするものなのでしょうか。 よろしくお願いします。

関連するQ&A