先の節で解説したランタイム系例外には以下の特徴がありました。
「文法上、例外が発生する可能性のある場所に、特段何の記述をしないでも良い。言い換えれば、try catch構文、あるいは throws節の記述は任意。実際に例外が発生した場合には、プログラムは強制終了する」。この性質のため、「チェックされない例外」と呼ばれます。
一方で、非ランタイム系例外の場合は、以下のどちらかを選択しなければなりません。
この性質のため、「チェックされる例外」と呼ばれます。
このクラスでは、URLクラスと MalformedURLExceptionクラスを扱います。
URLクラスはコンストラクタで MalformedURLException例外を発生する可能性があります。そして、MalformedURLExceptionは非ランタイム系例外のひとつです。
これらのクラスについての詳細について気になる方は、説明書(API)を参照してください。Java SE 7(Java 1.7)の説明書(API)を掲示しておきます→URLクラス・MalformedURLExceptionクラス。
なお、URLクラスのコンストラクタのうち、本節で使用するものについて以下に引用します。
URL public URL(String spec) throws MalformedURLException String 表現から URL オブジェクトを生成します。 このコンストラクタは、1 番目の引数に null を指定して、引数が 2 つのコンストラクタを呼び出すことと同じです。 パラメータ: spec - URL として構文解析される String 例外: MalformedURLException - 文字列に指定されたプロトコルが未知である場合
例外 MalformedURLExceptionが投げられる可能性があることが分かります。
URLクラスを用いたプログラムを以下に挙げます。
ソースコードは以下の通り。
O401/O401.java
import java.net.MalformedURLException; import java.net.URL; /** * 非ランタイム系例外を受け取ります。 */ public class O401 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { try { URL url1 = new URL("http://www.google.co.jp/"); System.out.println("変数 url1の参照先インスタンスの内容は " + url1); URL url2 = new URL("abcde://www.google.co.jp/"); System.out.println("変数 url2の参照先インスタンスの内容は " + url2); URL url3 = new URL("http://www.yahoo.co.jp/"); System.out.println("変数 url3の参照先インスタンスの内容は " + url3); } catch(MalformedURLException e) { System.out.println("URLに指定されたプロトコルが不正です。"); } System.out.println("プログラムは正常に終了しました。"); } }
実行結果は以下の通り。
変数 url1の参照先インスタンスの内容は http://www.google.co.jp/ URLに指定されたプロトコルが不正です。 プログラムは正常に終了しました。
もし、try catch構文を削除してしまうとビルドエラーになります。例外 MalformedURLExceptionは非ランタイム例外なので、try catchで捕捉するか throwsで投げるかどちらかをしなければなりません。
URL型インスタンスを扱う部分を メソッド printURLに分離したプログラムを以下に挙げます。このプログラムでは printURLメソッドで例外が発生する可能性があり、それを printURLメソッド内で try catchしています。
ソースコードは以下の通り。
O402/O402.java
import java.net.MalformedURLException; import java.net.URL; /** * 非ランタイム系例外を受け取ります。 */ public class O402 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { O402.printURL(); System.out.println("プログラムは正常に終了しました。"); } /** * URL型を利用して URLを表示します。 */ private static void printURL() { try { URL url1 = new URL("http://www.google.co.jp/"); System.out.println("変数 url1の参照先インスタンスの内容は " + url1); URL url2 = new URL("abcde://www.google.co.jp/"); System.out.println("変数 url2の参照先インスタンスの内容は " + url2); URL url3 = new URL("http://www.yahoo.co.jp/"); System.out.println("変数 url3の参照先インスタンスの内容は " + url3); } catch(MalformedURLException e) { System.out.println("URLに指定されたプロトコルが不正です。"); } } }
実行結果は以下の通り。
変数 url1の参照先インスタンスの内容は http://www.google.co.jp/ URLに指定されたプロトコルが不正です。 プログラムは正常に終了しました。
URL型インスタンスを扱う部分を メソッド printURLに分離したプログラムをもうひとつ、以下に挙げます。このプログラムでは printURLメソッドで例外が発生する可能性がありますが、printURLメソッド内では処理をせず throwsとしています。そして、メインメソッドで try catchしています。
ソースコードは以下の通り。
O403/O403.java
import java.net.MalformedURLException; import java.net.URL; /** * 非ランタイム系例外を受け取ります。 */ public class O403 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { try { O403.printURL(); } catch(MalformedURLException e) { System.out.println("URLに指定されたプロトコルが不正です。"); } System.out.println("プログラムは正常に終了しました。"); } /** * URL型を利用して URLを表示します。 * @throws MalformedURLException URL不正例外 */ private static void printURL() throws MalformedURLException { URL url1 = new URL("http://www.google.co.jp/"); System.out.println("変数 url1の参照先インスタンスの内容は " + url1); URL url2 = new URL("abcde://www.google.co.jp/"); System.out.println("変数 url2の参照先インスタンスの内容は " + url2); URL url3 = new URL("http://www.yahoo.co.jp/"); System.out.println("変数 url3の参照先インスタンスの内容は " + url3); } }
実行結果は以下の通り。
変数 url1の参照先インスタンスの内容は http://www.google.co.jp/ URLに指定されたプロトコルが不正です。 プログラムは正常に終了しました。