先の節で解説したランタイム系例外には以下の特徴がありました。
「文法上、例外が発生する可能性のある場所に、特段何の記述をしないでも良い。言い換えれば、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に指定されたプロトコルが不正です。 プログラムは正常に終了しました。