質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

setterにエラー文を組み込めるようにしたい

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 761

shou_hitotose

score 40

現在継承を使ったプログラムを書いています。
そこで変な値(今回の場合 先生なので年齢が20以下)だと「値がおかしいです。入力しなおしてください」というエラー文を出したいのですがエラー文が出てくれません。
どのように書き換えたらいいか教えてくださるとありがたいです。

最初に「人間」のクラスです。

public class Person {
    private String name;
    private int age;
    private double height;
    private double weight;
    private int shoes;
    private String subject;

    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

    public double getHeight() {
        return this.height;
    }

    public double getWeight() {
        return this.weight;
    }

    public int getShoes() {
        return this.shoes;
    }

    public String getSubject() {
        return this.subject;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age2) {
        if(age2>20) {
            this.age=age2;
        }else {
            System.out.println("Error");
        }
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public void setWeight(double weight) {
        this.weight=weight;
    }

    public void setShoes(int shoes) {
        this.shoes = shoes;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    Person(String name,int age2,double height,double weight,int shoes, String subject){
        this.name = name;
        this.age=age2;
        this.height = height;
        this.weight = weight;
        this.shoes = shoes;
        this.subject = subject;
    }

    public void printData() {
        System.out.println("名前は"+this.name+"です");
        System.out.println("年齢は"+this.age+"です");
        System.out.println("身長は"+this.height+"cmです");
        System.out.println("体重は"+this.weight+"kgです");
        System.out.println("買った靴は"+this.shoes+"足です");
        System.out.println("担当科目は"+this.subject+"です");
    }

}


次に「先生」のクラスです。

class Teacher extends Person {
    private String subject;


    public String getSubject() {
        return this.subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    Teacher(String name, int age, double height, double weight, int shoes, String subject) {
        super(name, age, height, weight, shoes, subject);
        // TODO 自動生成されたコンストラクター・スタブ
    }

    public void printData() {
        super.printData();
    }


}


そしてこれがメインクラスです。

public class Proj9 {


    protected String name;
    protected int age;
    protected double height;
    protected double weight;
    protected int shoes;
    protected String subject;
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ
        Teacher teacher1 = new Teacher("ロビンソン",2,189.9,81.3,67,"英語");
        teacher1.printData();

    }

}

現在Eclipse上ではエラーは特に出ていません。ただ20歳以下の値を入力してもエラーが出ない状態です。少し長くなってしまってすいません。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mather

    2019/06/26 16:47

    Eclipseタグは質問の内容とは無関係なので削除してください。

    キャンセル

回答 4

+2

単にsetAgeを呼び出していないからです。
コンストラクタとsetterは別物です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/26 17:12

    回答ありがとうございます。少し理解があやふやなところがあった気がします

    キャンセル

+2

setAge は age =  のときに自動で呼ばれるわけではないので、明示的に呼び出す必要があります。

    Person(String name,int age2,double height,double weight,int shoes, String subject){
        this.name = name;
        this.setAge(age2);
        this.height = height;
        this.weight = weight;
        this.shoes = shoes;
        this.subject = subject;
    }

しかし、ここでチェックをすることはあまりオススメではありません。
https://irof.hateblo.jp/entry/2016/01/09/231631

ファクトリメソッドで行うべきかと思います。

class Teacher extends Person {
  // 省略
  public static Teacher create(String name, int age, double height, double weight, int shoes, String subject) {
    // オブジェクトを作る前に入力値のチェック
    if (age <= 20) {
      throw new Exception("teacher's age must be more than 20.");
    }
    // 実際にオブジェクトを作る
    return new Teacher(name, age, height, weight, shoes, subject);
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/26 16:58

    回答ありがとうございます!参考にさせていただきます

    キャンセル

  • 2019/06/26 17:09

    @mather さん
    重箱の隅で恐縮ですが、元のコードを見ても『more than 20』に従っても条件式は age <= 20 が妥当では無いでしょうか。

    キャンセル

  • 2019/06/26 17:21

    そうですね。元のコードと条件が違ってるので修正しときます。

    キャンセル

+2

セッターの呼び出しをしていない云々は他の回答でもある通りなんですが、

そこで変な値(今回の場合 先生なので年齢が20以下)だと「値がおかしいです。入力しなおしてください」というエラー文を出したいのですがエラー文が出てくれません。

という要件を考えると、そもそもPersonクラスで「20以下か」をチェックしているのはおかしい気がします。
チェックする処理をTeacherクラスに実装するべきでは。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

少なくともJavaのセッターはただのメソッドであり、明示的に呼び出す必要があります。

Person(String name,int age2,double height,double weight,int shoes, String subject){
    this.name = name;
    //this.age=age2;
    setAge(age2);
    this.height = height;
    this.weight = weight;
    this.shoes = shoes;
    this.subject = subject;
}

他のセッターも必要なら使ってやって下さい。


なお、何でもかんでもセッター・ゲッターを生やすのはオブジェクト指向的には最悪の方法です。
(カプセル化の名の下にカプセル化をぶっ壊している状態)

後から各フィールドを変更しないのであればfinal指定してやると良いです。
この場合セッターは必要無く、考えように依ってはゲッターも必要無い程です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/26 16:57

    回答ありがとうございます! 参考にさせていただきます

    キャンセル

  • 2019/06/26 17:17

    setAge(age2)にして無事解決いたしました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る