第十九章 Exception(例外)
例外をスローさせてみる
実際に例外をスローさせてみましょう。
目次
1.例外をスローさせてみる
例外をスローさせるとどんな感じか見てみましょう。
ここでは、配列で例外をスローさせてみることにします。
パソコン壊れたり
しないっスか?
今までもソースコードを試して
上手くいかないと変なメッセージ
出てただろ?
あ~。
あれが「例外」なのね。
//Sample19_01.java
class Sample19_01{
public static void main(String[] args){
int[] intArray = new int[10]; //1
for(int i=0; i<10; i++){
intArray[i] = i; //2
}
for(int i=0; i<10; i++){
System.out.println("value: " + intArray[i]); //3
}
System.out.println(intArray[10]);//4 ここで例外スロー
System.out.println("complete"); //5
}
}
コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample19_01.java
ws>java Sample19_01
value: 0
value: 1
value: 2
value: 3
value: 4
value: 5
value: 6
value: 7
value: 8
value: 9
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at Sample19_01.main(Sample19_01.java:12)
コンパイル自体は問題なくできました。
java コマンドで実行すると以下のような流れで強制終了されました。
- intArrayを、要素数 10コの配列として初期化します。
- 0~9 までの値を各要素に代入しています。
- 代入した各要素の値を、「value: 値」 の形で表示させました。
- インデックス 10を参照しようとしましたが、
intArrayにはそのような要素がありません。
Java仮想マシンが例外をスローしました。
プログラムはここで強制終了しました。
- System.out.println("complete"); は実行されません。
今まで「変なの出た~!」
くらいにしか思ってなかったっすけど、
これが例外なんスね。
Java仮想マシンは、不正な処理を検出した時に例外をスローします。
例外には種類があって、今回の例外は
ArrayIndexOutOfBoundsException
(配列で範囲外のインデックスを参照した例外)
という長い名前の例外です。
RuntimeExceptionクラス(非チェック例外)の仲間ですね。
2.コンパイルエラー
ちなみに、コンパイルエラーの例も見てみましょう。
ここでも、配列でコンパイルエラーを発生させてみます。
今度はコンパイルエラーだ。
前のページで説明した通り
例外とは違う。
//Sample19_02.java
class Sample19_02{
public static void main(String[] args){
int[] intArray;
System.out.println(intArray[0]);// ここでコンパイルエラー
System.out.println("complete");
}
}
コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample19_02.java
Sample19_02.java:5: エラー: 変数intArrayは初期化されていない可能性があります
System.out.println(intArray[0]);
^
エラー1個
初期化されていない intArray の要素を参照しようとしました。
これは無理です。
コンパイルできませんでした。
なるほど。
「なんとかエクセプション」じゃ
ないわね。
javac コマンドで
コンパイルしたときに発生する
エラーだな。
コンパイルエラーは、文法が間違っている場合などに発生するので、
当然ですがプログラムで制御することはできません。
間違っているところを直しましょう。
お疲れ様でした。