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());
}
}
No.2
- 回答日時:
基本的な構造としては良いと思いますが、
catch(Exception e)は、コンストラクタ、setAgeからthrowされた例外に限らず、あらゆる例外をcatchしてしまいます。
(Exceptionはあらゆる例外の親クラスですから。)
細かいことを言うならば、
class MyException extends Exception
{
public MyException(String msg)
{
super(msg);
}
}
のようなユーザ定義例外MyExceptionを用意し、
これをthrow,catchするべきかと思います。
No.1ベストアンサー
- 回答日時:
setAgeが例外をthrowするのですから、これを呼び出しているmainのt1.setAge部分は、tryで囲むか、あるいはこれが書かれているmainメソッドをthrows Exceptionにしてやる必要があります。
要するに、例外は、throwするなら、その処理部分を呼び出している側のどこかで送られてきた例外を受け止める用意をしてやらないといけないわけです。
早速のご回答ありがとうございました。以下のようで動きましたが、考え方よろしいでしょうか?
■■age.java
package ex1;
public class age {
//***属性***//
private int age;
//***コンストラクタ***//
public age(int data)throws Exception{
if((data > 0) && (data <100)){
this.age= data;
}
else{
throw new Exception("値が不適切です");
}
}
//**メソッド**//
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.java
package ex1;
public class Sample {
public static void main(String[] args) {
try{
age t1;
t1 = new age(20);
System.out.println("t1_age="+ t1.getAge());
t1.setAge(200);
System.out.println("t1_age="+ t1.getAge());
}
catch(Exception e){
e.printStackTrace();
}
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- その他(プログラミング・Web制作) パイソン初心者です 4 2022/06/29 06:49
- その他(プログラミング・Web制作) Rでのスクリプトのご相談 3 2022/12/08 16:22
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c++,ある関数のクラスから別の...
-
クラス間でのデータ参照
-
java-別クラスの変数の使い方を...
-
Java リフレクションについて
-
C++でfriendクラスにしているの...
-
範囲外の数値を代入したらエラ...
-
C#でほかのファイルにある自作...
-
リフレクション
-
SwingでgetContentPaneのエラー...
-
リレーションエンティティクラ...
-
C++ クラス名の前のdefine
-
Java
-
関数内の変数に<summary>コメン...
-
スーパークラスのコンストラク...
-
C#のクラスライブラリでメッセ...
-
整数値を任意のオブジェクトを...
-
親クラスから子クラスへアクセス。
-
違うクラスからの変数の共有化
-
C#にて別クラスの関数を使いたい
-
構造 他のクラスの構造体を別...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
C#でほかのファイルにある自作...
-
C++でfriendクラスにしているの...
-
java-別クラスの変数の使い方を...
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
ひとつのファイルにクラスは1つ?
-
Java
-
import と extends について
-
継承したクラス側のクラス名の取得
-
SwingでgetContentPaneのエラー...
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
アップキャスト、ダウンキャス...
-
C# インターフェイスの実装
-
visual studioのデザイナ画面で...
おすすめ情報