ほぷしぃ

Java言語入門 〜C言語を学んだ君へ〜

[第13回]例外処理

[1] 意図的に例外を発生

前のページではプログラムの結果によって例外処理の方法を見てきました。
実は、例外処理は実際に意図的に起こすことができます。
意図的に起こすなんてただの嫌がらせをしたいわけではありません。

[2] throw

throwというキーワードを用いると意図的に起こしたい例外を起こすことができます。
また、throwで例外を起こすことを「例外を投げる」とか、「スローする」といいます。
どのようにやるのか見ていきましょう。

throwの形式

throw 例外インスタンス
throw new 例外インスタンス(引数);

基本は1つめの書き方を使います。
2つ目の書き方は1度だけ使いたい場合に使います。
throwは検出したメソッド内で処理をしたくない場合に用います。
これを使うことで、呼び出し元でその例外処理のお願いをするわけです。
では、2つ目の書き方を元に書き方を見ましょう。

サンプルプログラム

public class Java13_03{
    public static void main(String args[]){
        try{
            meth1();
        }catch (NullPointerException e){
            System.out.println("例外処理が発生:"+e.getMessage());
        }
    }
    public static void meth1(){
        
            throw new NullPointerException ("テスト");
        
    }
}

実行結果

throwサンプル実行結果

mainでmeth1()メソッドを実行し、throwで処理を返しています。
throw new 例外インスタンス(引数);で行っている時は、
getMessage()メソッドを使うと引数の中身を表示することができます。

[3] throws

次にthrowと少し似ているthrowsについて説明します。
throwsはメソッドの宣言で使います。

throwsの形式

修飾子 戻り値 メソッド名(引数)throws 例外クラス名{..}

細かい説明する前にプログラムで見たほうがわかりやすいと思います。
次のサンプルプログラムを見てください。

サンプルプログラム

public class Java13_04{
    public static void main(String args[]){
        try{
            meth1();
        }catch (NullPointerException e){
            System.out.println("例外処理が発生:"+e.getMessage());
        }
    }
    public static void meth1()throws NullPointerException{
        
            throw new NullPointerException ("テスト");
        
    }
}

実行結果

throwsサンプル実行結果

meth1()メソッドで起こる例外はNullPointerExceptionです。
そのため、呼び出し元のメソッド宣言にthrows NullPointerExceptionをつけます。
このメソッドの呼び出し元で、NullPointerExceptionの例外処理を書きます。
ここで、何かおかしなことを感じませんか。
これは少し前に書いたプログラムと全く変化がありません。
つまり、throwsをつけてもつけなくても処理内容は全く同じなのです。
では、どうしてthrowsというものをつけるのでしょうか。

throwsのメリット

・ メソッド内を見なくてもあらかじめ発生する例外に対して記述ができる
・ つけることにより、このメソッドでどのような例外がありえるのかが理解ができる

メソッドの内部も隅々までみなくても、メソッドの宣言部分を見るだけで
どの例外処理を準備すればいいのか一目瞭然になるわけです。
throwsはただ、このメソッド内で発生する可能性のある例外の情報をわかりやすくしているだけなのです。

[4] 例外の情報

例外の情報では、例外の情報をどのように見るのでしょうか。
確かに出力してみればいいでしょうが、もう少し効率のいい方法が欲しいです。
少し前にgetMessage()を使いました。
これが、例外の情報を詳しく見る方法なのです。

例外の情報を見るメソッド

メソッド 機能
printStackTrace() 例外の原因を調べる
toString() 例外の情報を文字列として習得
getMessage() コンストラクタで引数とした文字を取得

このような例外情報を見るメソッドはプログラムのミスを探す場合に大いに役に立ちます。



前のページへ ページのトップへ 第1問-問題へ