忘れ去られがちですが、エラーハンドル(エラー時に何をするかコントロールする)を行うのにこれが基本となります。
実装して動かしてみました。余計な音が入っています。
Exceptionの種類によりコントロールすことができます。
ちなみにしたの場合は、どんなエラーでもキャッチします。
try { } catch(Exception e) { }
参照するファイルが見つからないとき
try { } catch(FileNotFoundException e) { }
入出力関連のエラー
try { } catch(IOException e) { }
他にもあるのでそれに合わせたExceptionをキャッチしてやれば、どんな例外にも対応が可能!
try catch文
入出力や様々なところでエラーハンドルを
行うために使用します。
実際には、どんな例外も受け取るExceptionクラスを使用しても良いのですが、個別に例外をキャッチするとエラーハンドルがやりやすいと思います。
try{処理}catch(例外の種類){エラー処理}のようにcatchの部分にキャッツする例外を記述します。
見やすくするとこんな感じ
サンプルコードはこちら
例1: 標準入力を受け取るのに例外が投げられる可能性がある時
// try部分に例が発生するメソッド処理を記載する try { System.in.read(b); } catch(IOException e) { // 例外が起きた時にはキャッチ文ところで処理 e.printStackTrace(); }
キャッチする例外を分けたい場合は
対応する例外クラスがJavaAPIにあるのでそれをキャッチするように
します。
例2: 例外を別々に受け取る
// 5バイト(5文字)分 byte[] b = new byte[5]; try { // 入出力の例外を投げる System.in.read(b); // 文字列を受け取る String result = new String(b); // 文字列に'a'が見つからない場合 if (result.indexOf("a") == -1) { // 例外を投げる throw new Exception("入力違反です"); } } catch(IOException ie) { // 初めに標準入力の例外を受け取る様にする ie.printStackTrace(); } catch(Exception e) { // 自分で投げる例外をキャッチ e.printStackTrace(); }
ちなみに例外を扱う方法は他にもあって
メソッドで「例外をなげますよ」と指定する方法があります。
// Exceptionを投げる可能性があるメソッドを示す public void testException() throws Exception { // 何かの処理 }
この時にはtry catch文は記載する必要がありませんが
このメソッドを呼び出す側がtry catchする必要があります。
そして、以下の様な場合はmainメソッドで例外を検知できません。
public static void main(String[] args) { testPrint(); } /** * メインメソッドから直接(クラスをnew しないで)呼び出す時 * はメソッドの修飾子に「static」をつける */ public static void testPrint() { try { throw new Exception("必ず例外を投げます"); } catch(Exception e) { e.printStackTrace(); } }
呼び出し元に例外を検知させたくない場合に
上記の様な書き方を行います。
関連ページ
- 標準入力(コンソールからの入力)<System.inクラスについて>
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜