SJC-P対策 例外処理

例外処理について



javaの例外処理である「try, catch, finnaly」について
出題範囲となる箇所をメモ。


try句、catch句、finnaly句



try句の後は、必ずcatch句か、finnaly句が必要。
それがなければ、コンパイルエラーになる。

finnaly句は例外の発生に関わらず、try句以降に実行した
処理の後始末をするための仕組み。

たとえばファイルの入出力などに関しては、ファイルを開いた後に
例外が発生したとしても開いたファイルは、必ずを閉じなければいけない。

try{
	//ファイルを開く
	//ファイルの読み書き
} catch(IOException e) {
	//ファイル操作での例外発生
} finnaly {
	//開いたファイルを必ず閉じる
}


tryとcatchとfinnalyの間には、他の処理をはさむ事はできない。

try {
	//hogehoge
} 
System.out.println("hogehoge");	//コンパイルエラー
catch (Exception e) {
}




例外の伝達



例外は必ずキャッチする必要は無い。

ただしアプリケーションのエントリポイントであるmain()にまで
例外が到達すると、main()からJVMに例外が投げられる。
そうすると、JVMがクラッシュしてアプリケーションが停止する。

JVMがクラッシュした際は、スタックトレースが出力される。
つまりら以外の発生した場所から、コールスタックを辿った
順に例外が伝達されたメソッドを出力する。

class Test {
	public static void main(String args[])
	{
		f1();
	}

	public static void f1() {
		f2();
	}

	public static void f2() {
		f3();
	}

	public static void f3() {
		f4();
	}

	public static void f4() {
		f5();
	}

	public static void f5() {
		//0除算エラー
		System.out.println(10 / 0);
	}
}


この場合、例外をまったくキャッチしていないので
発生した例外は、JVMをクラッシュさせます。

f5()	//throw Exception
f4()	//throw Exception
f3()	//throw Exception
f2()	//throw Exception
f1()	//throw Exception
main()	//throw Exception to JVM




例外階層



例外クラスも、元を辿ればObjrctクラスです。

ExceptionクラスはThrowableを継承しています。
他のThrowableを継承しているクラスとして、
Errorクラスがあります。

Errorは例外とは違い、あまり気にしなくとも良いです。
普通エラーが起こったときは、アプリケーションを回復できる
見込みが少ないので少なくともErrorをキャッチする必要は無い。

ただし、Errorクラスのオブジェクトも例外クラスと同じように
キャッチする事ができる。

例外マッチング



ある特定の例外をキャッチする際に、キャッチするオブジェクトクラスは
範囲の狭い例外クラスから指定しなければいけない。

たとえばファイル入出力の例外を書くとき。

try {
	//HogeHoge
} catch(IOException e) {
	//hoge
} catch(FilrNotFoundException ex) {
	//ここには到達しない
}


このコードをコンパイルするとエラーが発生する。

Exceptionクラスの参照関係は、IOExceptionクラスの方が、例外の受けが広い。
よって、ファイル入出力関係の例外は、全てIOExceptionが受け止めてしまう。