イントロダクション
忘れ去られがちですが、エラーハンドル(エラー時に何をするかコントロールする)を行うのには、この文法が基本となります。
実装して動かしてみました。余計な音が入っています。
Exceptionの種類によりコントロールすことができます。コントロールと言ってもExceptionの種類によって処理をかえるというものです。
ちなみにしたの場合は、どんなエラーでもキャッチします。
具体的には、下のように「catch(Exception e)」と書くことですべての例外をキャッチします。
try {
// 例外が予想される処理
// throws文のあるメソッド呼び出し
} catch(Exception e) {
// 例外の内容を表示
e.printStackTrace();
}
参照するファイルが見つからないときの例外をキャッチしたいとき+すべての例外をキャッチ。
try {
// 例外が予想される処理
// throws文のあるメソッド呼び出し
} catch(FileNotFoundException e) {
// 例外の内容を表示
e.printStackTrace();
} catch(Exception ex) {
// 例外の内容を表示
e.printStackTrace();
}
入出力関連のエラー(例外)をキャッチ+すべての例外をキャッチ。
try {
// 例外が予想される処理
// throws文のあるメソッド呼び出し
} catch(IOException e) {
// 例外の内容を表示
e.printStackTrace();
} catch(Exception ex) {
// 例外の内容を表示
e.printStackTrace();
}
他にもあるのでそれに合わせたExceptionをキャッチしてやれば、どんな例外にも対応が可能!
ちなみにIF文と同じで、Exceptionをキャッチする行を上に持ってくると、下のキャッチ文に届きません。。。
try catch文
基本的な使い方としては、入出力や様々なところでエラーハンドルを行うために使用します。他にも「throw new Exception("メッセージ")」のように独自のメッセージを例外とともに投げることが出来ます。ちなみに「投げる」というのはthrowするという意味です。
実際には、どんな例外も受け取るExceptionクラスを使用しても良いのですが、個別に例外をキャッチするとエラーハンドルがやりやすいと思います。
try{処理}catch(例外の種類){エラー処理}のようにcatchの部分にキャッツする例外を記述します。
見やすくするとこんな感じ
サンプルコードはこちら
実装例
try-catch文を場合分けして、サンプルコードを書きました。色々な例外クラスがあるのでJavaDocで調べてみるのも一つです。
例1: 標準入力を受け取るのに例外が投げられる可能性がある時
入出力系の例外はIOExceptionでキャッチします。
// 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〜
関連ページ
- Java はじめて 1 〜メインメソッド〜
- Java はじめて2 〜メソッドを呼び出す〜
- Java はじめて3 〜コメントの書き方〜
- Java はじめて4〜練習問題をやってみる〜
- Java はじめて5 〜変数について〜
- Java はじめて6 〜変数について2、byte, char, boolean型〜
- Java はじめて7 〜配列とは、配列の使い方〜
- Java はじめて8 〜booleanとif~
- Java はじめて 9 〜switch文〜
- Java はじめて 10 〜ループ処理A: for文1〜
- Java はじめて 11 〜ループ処理A: for文2 拡張for文〜
- Java はじめて12 〜ループ処理B: while文〜
- Java はじめて13 〜ループ処理C: do-while文〜
- Java はじめて14 〜クラスの作り方〜
- Java はじめて15 〜クラス型変数の使い方〜
- Java はじめて16 〜クラス設計から実装〜
- Java はじめて17 〜設計後の部品を実装する1〜
- Java はじめて18 〜設計後の部品を実装する2〜
- Java はじめて19 〜コンストラクタの役割を見る〜
- Java はじめて20 〜チェック処理クラスを作る〜
- Java はじめて21 〜オブジェクト指向的分析、アプリの拡張をする〜
- Java はじめて22 〜オブジェクト指向的分析、アプリ拡張の実装とテスト〜
- Java はじめて23 〜テスト駆動型開発を行う〜
- Java はじめて24 〜JUnitでのテスト駆動型開発1〜
- Java はじめて25 〜JUnitでのテスト駆動型開発2: テストケース作成〜
- Java はじめて26 〜JUnitでのテスト駆動型開発3: クラスの実装〜
- Java はじめて27 〜JUnitでのテスト駆動型開発4: 追加修正と実装〜
- Java はじめて28 〜JUnitでのテスト駆動型開発5: ファイル出力の実装〜
- Java はじめて29 〜JUnitでのテスト駆動型開発6: ファイル読み込みのテスト〜
- Java はじめて30 〜JUnitでのテスト駆動型開発7: テストクラスの実装方法〜
- Java はじめて31 〜JUnitでのテスト駆動型開発8: 処理をつなげたテスト〜