非ランタイム系例外

みるくあいらんどっ! > ドキュメント > Java > じっくり学ぶ Java講座 [初心者向け・入門]


ランタイム系例外と非ランタイム系例外

先の節で解説したランタイム系例外には以下の特徴がありました。

「文法上、例外が発生する可能性のある場所に、特段何の記述をしないでも良い。言い換えれば、try catch構文、あるいは throws節の記述は任意。実際に例外が発生した場合には、プログラムは強制終了する」。この性質のため、「チェックされない例外」と呼ばれます。

一方で、非ランタイム系例外の場合は、以下のどちらかを選択しなければなりません。

  • 例外が発生する部分を 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が投げられる可能性があることが分かります。

try catch構文を使用する

try catch構文を使用する (1)

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で投げるかどちらかをしなければなりません。

try catch構文を使用する (2)

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に指定されたプロトコルが不正です。
プログラムは正常に終了しました。

throwsを使用する

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に指定されたプロトコルが不正です。
プログラムは正常に終了しました。
最終更新: 2014/08/01 , 公開: 2013/03/01
▲top