前回「EclipseでJavaの例外を理解する」では、Javaにおける例外の用途と基本的なコードの書き方、例外が発生するさまざまなケースについて理解しました。今回は、独自に例外を定義する方法や、ちょっとした例外のテクニックを紹介しましょう。
それでは、独自の例外を定義する方法を解説しましょう。前回で説明した内容から、独自の例外を定義する場合の基本はjava.lang.Exceptionを継承する例外クラスを定義することにあると分かります。ここではSampleExceptionというクラスを作成してみましょう。Eclipseで例外クラスを定義するには下記のような手順になります。
例外クラスを作成したら、次のようにコーディングを完成させてください。
public class SampleException extends Exception { private int code; public SampleException(int code, String message) { super(message); this.code = code; } public int getCode() { return code; } }
ここでは、サンプルなのでcodeフィールドを用意しましたが、どんな例外が発生したかを例外クラスの型だけで表現することも多いので、特別なフィールドを持たない次のSampleException2のような例外クラスを定義することもあるでしょう。
public class SampleException2 extends Exception { public SampleException2(String message) { super(message); } }
次に、この例外を投げるメソッドを持つクラスを作成します。メソッドではどんな例外を投げるか宣言する必要があるので、キーワードthrows を使って投げる例外クラスを記述します。ここでは、ユーザー名の一覧をフィールドusersで持ち、対応するパスワード一覧をフィールドpasswordsで持つSample330クラスを用意し、ここへnameとpasswordをパラメータとするloginメソッドを作成することにします。このメソッドでは例外としてSampleExceptionとSampleException2を投げるようにします。
public class Sample330 { private String[] users = { "Akira", "Jacky" }; private String[] passwords = { "777", "*" }; public boolean login(String name, String password) throws SampleException, SampleException2 { int i; for (i = 0; i < users.length; i++) { if ("".equals(name.trim())) { throw new SampleException(1, "ログインに失敗しました。"); } else if ("".equals(password.trim())) { throw new SampleException(2, "ログインに失敗しました。"); } if (users[i].equals(name)) { if (passwords[i].equals("*")) { throw new SampleException2("ログインに失敗しました。"); } else if (passwords[i].equals(password)) { return true; } else { return false; } } } return false; } }
メソッドの中では例外を投げる条件が満たされているときに、キーワードthrow を使って例外を投げます。普通は例外のインスタンスを新規に生成して投げます。ここではSampleExceptionの例外を投げる条件は、nameの先頭と最後の空白を省略した結果が空文字列である場合か、passwordの先頭と最後の空白を省略した結果が空文字列の場合としました。このとき、どちらが原因となって例外が発生したのか分かるようにSampleExceptionのcode値を変えています。また、nameに対応するpasswordに「*」という文字列が設定されている場合は、そのnameが無効になっていると想定して、SampleException2の例外を投げるようにしています。
Sample330クラスを使用して動作するプログラムは次のようになります。Sample330クラスのloginメソッドが投げるSampleExceptionとSampleException2をキャッチするようにtry文を記述しています。処理が実行されている順番が分かるように、すべて標準エラー出力へメッセージを出力しています。
public class Sample331 { public static void main(String[] args) { String[] users = { "Sara", "Akira", "Akira", "Jacky", "" }; String[] passwords = { "", "777", "111", "abc", "xyz" }; Sample330 sample = new Sample330(); for (int i = 0; i < users.length; i++) { try { System.err.print("i=" + i + ":"); boolean isLogin = sample.login(users[i], passwords[i]); if (isLogin) { System.err.println("ログインに成功しました。(" + users[i] + ")"); } else { System.err.println("ログインに失敗しました。"); } } catch (SampleException e1) { e1.printStackTrace(); System.err.println("code[" + e1.getCode() + "]"); } catch (SampleException2 e2) { e2.printStackTrace(); } System.err.println(""); } } }
これを実行すると画面2のようになります。
nameが「Sara」でpasswordが半角空白の文字列だと、Sample330クラスのloginメソッドはSampleExceptionを投げるので、それをキャッチしたcatch節の処理が実行されます。この結果スタックトレースが出力された後、codeの値である2が出力されています。次には、nameが「Akira」でpasswordが「777」の場合は例外は投げられずに正常に処理が終了しています。これ以降も同様に見ていけば、意図したとおりに例外が投げられて、それをキャッチして処理が行われていることが分かるはずです。
Copyright © ITmedia, Inc. All Rights Reserved.