>> Java入門トップに戻る

例外処理 try catch finally

Javaのtry catch構文について説明します。

try catch文は実行中に例外が発生した時に、処理を中断せずにその例外をキャッチし、特定の処理をさせることができる構文です。
try catch文がないと「例外が発生した時点で処理が中断」してしまいます。

try catch文は以下の様に書きます。
try{
	
	~例外が発生する可能性のある処理~
	
}catch(例外クラス1 変数){
	
	~例外クラス1の例外が発生した時の処理~
	
}catch(例外クラス2 変数){
	
	~例外クラス2の例外が発生した時の処理~
	
}
tryブロックには例外が発生する可能性のある処理を書きます。

catch()の()内には発生する例外のクラスとそのクラスのインスタンスを格納する変数を書きます。
catch{}のブロック内には、指定した例外クラスが発生した時の処理を書きます。
このcatchは上記のように複数書くことが出来ます。

では実際にコードを見てみましょう。
package test6;

public class TryCatch {

	public static void main(String[] args) {
		int value = 10;
		
		try {
			//0で除算して例外を発生させる。
			value = value / 0;
			//ココは処理されない
			System.out.println("Hello");
			
		} catch (ArithmeticException e) {
			//例外内容を出力
			e.printStackTrace();
		}
		
		System.out.println("こんにちは");

	}
}
10行目のtryブロック内で、0で除算することにより例外を発生させています。
このような算術計算関連で例外が発生すると「ArithmeticException」という例外が発生します。

ArithmeticException」の例外が発生したことにより、catchブロックへ処理が移るので、12行目のHelloという文字を出力する処理は実行されません。
catchブロック内では「ArithmeticException」のインスタンスが入った変数eから「printStackTrace」というメソッドを実行しています。
これは例外の内容をコンソールに出力してくれるメソッドです。

その後はcatchブロックを拔けて、通常通り後続の処理が実行されていきます。
最初にも書きましたが、「このtry catch文がないと例外が発生した時点で処理がストップ」します。
上記のコードだと10行目で例外が発生するのでここでストップしてしまいます。

なので例外処理は処理を中断させずに続行するために利用したり、例外内容を出力してデバッグに役立てたりする時に使われます。

今回は「ArithmeticException」という例外を発生させましたが、他にも配列の範囲外の要素を参照した時に発生する例外「ArrayIndexOutOfBoundsException」などたくさんの例外があります。
全ては覚えきれませんし、今後プログラミングをしながら一つずつ覚えていけばいいと思います。
親切なことにeclipseは例外が発生する可能性があるコードを書くと、try catchで囲むように教えてくれたりすることがあります。

また、これらの例外クラスは全て「Exception」というクラスを継承しているので、「catch(Exception e)」と書けばどんな例外でもキャッチしてくれます。
なのでとりあえず「try catch(Exception e)」で囲んでおけば、最低限の例外処理は出来ることになります。

finallyブロック

try catch文には「finally」というブロックも書くことができます。
これは「例外が発生するしないに関わらず最終的に実行する処理」を書くことができます。
以下のコードを見てください。
package test6;

public class TryCatch {

	public static void main(String[] args) {
		int value = 10;
		
		try {
			//0で除算して例外を発生させる。
			value = value / 0;
			//ココは処理されない
			System.out.println("Hello");
			
		} catch (ArithmeticException e) {
			//例外内容を出力
			e.printStackTrace();
		}finally{
			System.out.println("finallyです。");
		}
		
		System.out.println("こんにちは");

	}
}
先程のコードと同じように0で除算して例外を発生させてますが、catch内の処理が実行された後に、finallyのブロックの処理が実行されます。
finallyブロックの処理が終わると通常通り後続の処理が実行されていきます。

上記の10行目で0で除算しているところを1で除算するように書き換えて実行してみてください。
例外が発生しないのでcatchブロック内の処理は実行されませんが、finallyブロックの処理は実行されることが確認できます。

このようにfinallyブロックは例外が発生するしないに関わらずに最終的に実行する処理を書くことが出来ます。

>> 【Stringクラス 文字列の長さ取得 length】に進む
>> Java入門トップに戻る