例外状況の報告 〜thowで例外を投げる〜
☆ 例外的状況をJVMに報告する
例外状況を監視しているJVMに対して私たちが「~Exceptionという例外状況になりました」と報告することができる
→これにより、自分が作成したクラスに例外状況が発生した際に、きちんと例外処理が発生するかを事前にチェックすることができる
〈構文 例外状況の報告~例外を投げる〉
throw 例外インスタンス:
(例外インスタンスには、例外の詳細情報が詰め込んである)
JVMに今すぐ代替案実施(catch文を実行してシステムから抜けるなど)をしろという指示
→「例外を投げる」
※ 一般的には「throw new 例外クラス名("エラーメッセージ");」
ex. public class Person{
int age;
public void setAge(int age){
if(age<0){
throw new IllegalArgumentException("年齢は正の数を指定すべきです。指定値="+age);
} //もし年齢に負の値がセットされたらMainに投げつける
}
this.age=age; //問題ないならフィールドに値をセット
}
public class Main{
public static void main(String[ ] args){
Person p=new Person( );
p.setAge(-128); //テストとして誤った値のセットを試みる
}
※ try-catch文が不要になるスロー宣言で使うthrowsと
例外状況の報告で使うthrowは似ているけど、全く違うものなので注意
・既存の例外クラスに例外状況に対応するクラスがない場合
→既存の例外クラスを継承してオリジナルの例外クラスを作る
ex.音楽プレイヤーソフト
「対応していない形式のファイルを作成しようとした」という場面に対応できる例外クラスを使いたいが、既存のクラスにはない
→ RuntimeExceptionを継承して、オリジナルの例外クラスを作成する
〈継承元となりうるクラスの種類〉
IOException Exception RuntimeException など
ただ上記の継承元の親クラス
ThrowableやErrorの子クラスとしてオリジナルを定義することはほとんどない
(上記のクラスの子クラスとしてIOExceptionなどが既に定義されているから)
ex. オリジナル例外を定義
public class UnsupportMusicFileException extends Exception(String msg){
//対応されていない形式のファイルを作成しようとした場合 //Exception(チェック例外)を継承
//エラーメッセージを受け取るコンストラクタ
public Unsuport…Exception(String msg){
super(msg);
//継承元のクラスのコンストラクタへ情報(String msg)を渡す
}
}
オリジナル例外を利用
public class Main{
public static void main(String[ ] args){
try{
//試験的に例外を発生させる
throw new Unsupport……Exception("未対応のファイルです");
//("未対応のファイルです")→定義されているクラスの中の引数String msgが受け取る
}catch(Exception e){
e.print StackTrace( );
//JVMが行った例外処理の手順全表示
}
※ 大規模なプログラム開発では、
プログラムで想定されるさまざまな例外的状況を思い浮かべ、
オリジナルの例外クラスとして作成することで、
きめ細かい実行時エラーの対応が可能になる