例外操作
例外を投げる
実行中に思いがけない問題が発生した時に、例外という割り込みがあるのはわかりました
また、それをtryとcatchなどを使って操作することもできました
では、今度はこちら側で明示的に例外を操作しましょう
例外を明示的に発生させたりするにはthrowステートメントを使います
throw param;
これは、基本的なthrowステートメントの書式です
catchブロックないに記述し、例外が発生した時にパラメータを戻します
たとえば次のプログラムを見てください
class test {
public static void main(String args[]) {
try {
first();
}
catch (ArithmeticException err) {
System.out.println("てめぇは俺よりバカだった…\n" + err);
}
}
static void first() {
try {
second();
}
catch (ArithmeticException err) {
System.out.println("たったひとつのシンプルな答えだ");
}
}
static void second() {
try {
System.out.println(10 / 0);
}
catch (ArithmeticException err) {
System.out.println("エラーの原因はたった一つ");
}
}
}
secont()メソッドないで例外が発生しています
このメソッドのcatchに、この例外ハンドラに対応するcatchブロックがあるので
プログラムはこのメソッド内のcatchブロックを実行して問題なく終了します
実行結果は次のようになりました
エラーの原因はたった一つ
しかし、例外が発生したメソッドの呼び出し元のメソッドの例外処理も必要だとしたらどうでしょう?
first()、main()メソッド内にもArithmeticExceptionに対応したcatchが存在します
メソッドの呼び出し元にもパラメータを返して例外処理をする必要があるような場合
throwステートメントで例外オブジェクトを投げることができます
class test {
public static void main(String args[]) {
try {
first();
}
catch (ArithmeticException err) {
System.out.println("てめぇは俺よりバカだった…\n" + err);
}
}
static void first() {
try {
second();
}
catch (ArithmeticException err) {
System.out.println("たったひとつのシンプルな答えだ");
throw err;
}
}
static void second() {
try {
System.out.println(10 / 0);
}
catch (ArithmeticException err) {
System.out.println("エラーの原因はたった一つ");
throw err;
}
}
}
期待したとおりの結果が得られます
もし呼び出し側のメソッドに対応したcatchがない場合は
前章のcatchの検索純と同様にスレッドをさかのぼって検索します
それでもなかった場合は、やはり規定の例外処理が実行されてプログラムが終了します
さらにthrowステートメントで明示的に例外を発生させることもできます
つまり、こちら側でわざと例外を発生させることができるのです
throw new ExceptionType(args);
ExceptionTypeには、例外オブジェクトの型を指定します
argsは省略可能な引数です
これがtryブロック内で実行されると、指定した型の例外が発生します
つまりcatchの検索がはじまり、例外処理をします
class test {
public static void main(String args[]) {
try {
throw new ArithmeticException();
}
catch(ArithmeticException err) {
System.out.println("例外が発生しました :" + err);
}
}
}
throwステートメントと例外の関係を、自分でプログラムして調べてください
catchの検索順序や、finallyブロックの存在を常に意識することが大切です
throw
tryブロックで例外を発生させます
また、catchブロック内で例外オブジェクトを返すこともできます