>> 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入門トップに戻る
●更新履歴
2016/08/16 Java入門ページにページを幾つか追加
2016/04/08 Java入門ページ作成
2016/03/09 メニューレイアウト変更。ブラウザキャッシュのクリアをお願い致します。
2016/03/09 PDOトランザクション、自動コミットモードをオフ追加
2016/03/09 PDO 例外処理 try catch追加
2016/03/09 PDO update文実行追加
2016/03/09 PDO delete文実行追加
2016/03/09 PDO insert文実行追加
2016/03/09 PDO selectでデータを取得、fetchAll、queryメソッド追加
2016/03/09 PDO bindValueとbindParamの違い追加
2016/03/09 PDO prepare プリペアドステートメントの使い方追加
2016/03/04 ソースコードをクリップボードにコピーする機能を追加
2016/03/04 C言語、C++のページのソースコードを一部修正
2014/01/31 C言語関数一覧ページに11ページほど追加
2014/01/31 C言語関数一覧ページに30ページほど追加
2014/01/30 C言語関数一覧ページ作成中
2013/07/01 レイアウト変更に伴いブラウザキャッシュのクリアをお願いします。
2013/07/01 MySQL入門ページ作成
2013/07/01 PHP入門ページにSQLite学習項目追加
2013/06/25 ドメイン変更、レイアウトを一部変更
2013/03/14 レイアウトを一部変更
2012/08/13 C言語よくある課題・宿題ページ開設!
2012/08/13 シューティングゲーム作成第33章追加!
2012/08/11 ドメイン変更&サーバ移設完了
2012/04/21 シューティングゲームプログラミング第2,3章の内容を修正
2012/04/19 シューティングゲームプログラミング第2章の内容を修正
2012/04/03 Googleカスタム検索を設置!
2012/04/03 シューティングゲームプログラミング第32章追加!
2012/04/03 シューティングゲームプログラミング第31章追加!
2012/03/31 サイトをリニューアルしました!
2012/03/25 シューティングゲームプログラミング第30章追加!
2012/03/19 シューティングゲームプログラミング第29章追加!
2012/03/16 シューティングゲームプログラミング第28章追加!
2012/02/27 シューティングゲームプログラミング第27章追加!
2012/02/03 シューティングゲームプログラミング第26章追加!
2012/01/31 シューティングゲームプログラミング第25章追加!
2012/01/20 シューティングゲームプログラミング第23,24章追加!
2012/01/11 シューティングゲームプログラミング第22章追加!
2012/01/05 トップページ、ゲームプログラミング関連のトップページのデザインを変更
2012/01/04 シューティングゲームプログラミング第21章追加!
2012/01/01 シューティングゲームプログラミング第20章追加!
2011/12/25 シューティングゲームプログラミング第19章追加!
2011/12/22 シューティングゲームプログラミング第18章追加!
2011/12/18 シューティングゲームプログラミング第17章追加!
2011/12/17 シューティングゲームプログラミングページOPEN!
2011/11/21 ゲームプログラミングページOPEN!
2011/11/21 サイトデザインを大幅に変更
2011/11/17 TOPページのデザインを変更。相互リンクページに、複数サイト追加。
2011/11/06 WINAPI学習ページ(33~36章)追加
2011/11/05 WINAPI学習ページ(20~32章)追加
2011/10/27 WINAPI学習ページ(14~19章)追加
2011/10/21 WINAPI学習ページ(13章)追加
2011/10/21 サイトマップ、連絡ページ追加
2011/10/17 WINAPI学習ページ(6~11章)追加
2011/10/16 WINAPI学習ページ(1~5章)追加
2011/10/13 全体のレイアウト変更
2011/10/07 PHP学習ページ(8~11章)追加
2011/10/06 PHP学習ページ(1~7章)作成
2011/10/06 JavaScriptリファレンスページ作成
2011/10/05 C言語学習ページ発展編(10~14章)追加
2011/10/04 C言語学習ページ発展編(1~9章)追加。
2011/10/03 HTML/CSSリファレンスのページ追加。(個々の詳細ページは作成中)
2011/09/30 HTML学習ページ(8章)追加
2011/09/29 JavaScript学習ページ(12~17章)追加
2011/09/28 JavaScript学習ページ(1~11章)追加
2011/09/27 HTML学習ページ(4~7章)追加
2011/09/26 C言語学習ページ(27章)追加、C++学習ページ(17章)、HTML学習ページ(1~3章)追加
2011/09/25 C言語学習ページ(23~26章)を追加
2011/09/24 C++学習ページ(9~16章)追加
2011/09/23 C++学習ページ(3~8章)追加
2011/09/22 C言語の学習ページ(22章)とC++学習ページ(1~2章)追加
2011/09/21 C言語の学習ページ(15章~21章)を追加
2011/09/20 C言語の学習ページ(10章~14章)を追加
2011/09/19 サイト作成(随時更新予定)