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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

2821閲覧

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

shou_hitotose

総合スコア66

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/06/26 07:41

編集2019/06/26 08:10

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

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

Java

1public class Person { 2 private String name; 3 private int age; 4 private double height; 5 private double weight; 6 private int shoes; 7 private String subject; 8 9 public String getName() { 10 return this.name; 11 } 12 13 public int getAge() { 14 return this.age; 15 } 16 17 public double getHeight() { 18 return this.height; 19 } 20 21 public double getWeight() { 22 return this.weight; 23 } 24 25 public int getShoes() { 26 return this.shoes; 27 } 28 29 public String getSubject() { 30 return this.subject; 31 } 32 33 public void setName(String name) { 34 this.name = name; 35 } 36 37 public void setAge(int age2) { 38 if(age2>20) { 39 this.age=age2; 40 }else { 41 System.out.println("Error"); 42 } 43 } 44 45 public void setHeight(double height) { 46 this.height = height; 47 } 48 49 public void setWeight(double weight) { 50 this.weight=weight; 51 } 52 53 public void setShoes(int shoes) { 54 this.shoes = shoes; 55 } 56 57 public void setSubject(String subject) { 58 this.subject = subject; 59 } 60 61 Person(String name,int age2,double height,double weight,int shoes, String subject){ 62 this.name = name; 63 this.age=age2; 64 this.height = height; 65 this.weight = weight; 66 this.shoes = shoes; 67 this.subject = subject; 68 } 69 70 public void printData() { 71 System.out.println("名前は"+this.name+"です"); 72 System.out.println("年齢は"+this.age+"です"); 73 System.out.println("身長は"+this.height+"cmです"); 74 System.out.println("体重は"+this.weight+"kgです"); 75 System.out.println("買った靴は"+this.shoes+"足です"); 76 System.out.println("担当科目は"+this.subject+"です"); 77 } 78 79} 80

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

Java

1class Teacher extends Person { 2 private String subject; 3 4 5 public String getSubject() { 6 return this.subject; 7 } 8 9 public void setSubject(String subject) { 10 this.subject = subject; 11 } 12 13 Teacher(String name, int age, double height, double weight, int shoes, String subject) { 14 super(name, age, height, weight, shoes, subject); 15 // TODO 自動生成されたコンストラクター・スタブ 16 } 17 18 public void printData() { 19 super.printData(); 20 } 21 22 23} 24

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

Java

1public class Proj9 { 2 3 4 protected String name; 5 protected int age; 6 protected double height; 7 protected double weight; 8 protected int shoes; 9 protected String subject; 10 /** 11 * @param args 12 */ 13 public static void main(String[] args) { 14 // TODO 自動生成されたメソッド・スタブ 15 Teacher teacher1 = new Teacher("ロビンソン",2,189.9,81.3,67,"英語"); 16 teacher1.printData(); 17 18 } 19 20} 21

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2019/06/26 07:47

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

回答4

0

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

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

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

投稿2019/06/26 08:16

gentaro

総合スコア8949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

java

1 Person(String name,int age2,double height,double weight,int shoes, String subject){ 2 this.name = name; 3 this.setAge(age2); 4 this.height = height; 5 this.weight = weight; 6 this.shoes = shoes; 7 this.subject = subject; 8 }

しかし、ここでチェックをすることはあまりオススメではありません。
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 07:56

編集2019/06/26 08:22
mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shou_hitotose

2019/06/26 07:58

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

2019/06/26 08:09

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

2019/06/26 08:21

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

0

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

投稿2019/06/26 07:46

dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shou_hitotose

2019/06/26 08:12

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

0

ベストアンサー

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

Java

1Person(String name,int age2,double height,double weight,int shoes, String subject){ 2 this.name = name; 3 //this.age=age2; 4 setAge(age2); 5 this.height = height; 6 this.weight = weight; 7 this.shoes = shoes; 8 this.subject = subject; 9}

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


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

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

投稿2019/06/26 07:47

編集2019/06/26 08:07
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shou_hitotose

2019/06/26 07:57

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

2019/06/26 08:17

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問