- 締切済み
例外処理(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()); } }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
基本的な構造としては良いと思いますが、 catch(Exception e)は、コンストラクタ、setAgeからthrowされた例外に限らず、あらゆる例外をcatchしてしまいます。 (Exceptionはあらゆる例外の親クラスですから。) 細かいことを言うならば、 class MyException extends Exception { public MyException(String msg) { super(msg); } } のようなユーザ定義例外MyExceptionを用意し、 これをthrow,catchするべきかと思います。
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(); } } }