Java Silver SE11 10章
黒本をもとに学んだことをアウトプットしていきます。
主に問題を解いていて、間違えた箇所もしくは知らなかった内容になります。
例外処理
例外が発生したときに、「どのように対処するか」を記述した処理のこと。
Javaではtry-catch(-finally)
構文で記述する。
tryブロック
:例外が発生する可能性のある処理
catchブロック
:例外が発生した時の処理
finallyブロック
:例外発生の有無に関わらず実行したい処理(省略可能)
例外が発生した時、tryブロックの以降の処理を実行せず、catchブロックに移行される。
ルール
- try-catch-fianllyの順番は変更できない、変更した場合コンパイルエラーになる
- tryブロックとfinallyブロックは1つのみ、catchブロックは複数記述可能
- catchブロックでreturnしても、戻る前にfinallyブロックが必ず実行される
構文
try {
// 例外が発生する可能性のある処理
} catch (例外クラス型 変数名) {
// 例外が発生した時の処理
}
try {
// 例外が発生する可能性のある処理
} catch (例外クラス型 変数名) {
// 例外が発生した時の処理
} finally {
// 例外発生の有無に関わらず実行したい処理
}
例題
public class Main {
public static void main(String[] args) {
try {
int array[] = {};
array[0] = 10;
System.out.println("finish");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("error");
}
}
}
// 結果
// error
例外
プログラムが対処できるトラブルを例外
という。
例外は、検査例外
と非検査例外
に分かれる。
-
検査例外
- 例外処理を記述したかどうかコンパイラが検査する例外のこと
- Exceptionクラスのサブクラスは、RuntimeExceptionとそのサブクラスを除いて、全て
検査例外
に該当する -
try-catch
しているか、throws句
で宣言している必要がある
-
非検査例外
- 例外処理を記述したかどうかコンパイラが検査しない例外のこと
- Exceptionクラスのサブクラスではあるが、
RuntimeExceptionとそのサブクラス
は非検査例外
として扱われる -
try-catch
とthrows句
はする必要がない (記述は可能)
例外クラス
問題で出題された例外クラスをまとめる。
例外クラス | 内容 |
---|---|
ArrayIndexOutOfBoundsException | 配列の要素外に対するアクセス |
StringOutOfBoundsException | 文字列の範囲外に対するアクセス |
IndexOutOfBoundsException | 配列や文字列、コレクションの範囲外であることを表す。また上記2つのスーパークラスに該当する |
NullPointerException | nullに対してメソッドを呼び出そうとしている |
ClassCastException | 継承関係や実現関係にないクラスをキャストしようとしている |
エラー
プログラムが対処できない事態をエラー
という。
プログラムからは回復不可能なトラブルが発生したことを指している。
例:メモリ不足、読み書きの権限がない、ネットワーク接続できない など
- Errorクラスがあり、主にサブクラスが使用される
- OutOfMemoryError, NoClassDefFoundError, StackOverflowError など
- エラーに分類されるには、Errorを継承する必要がある
- try-catch, throwsを宣言する必要はない
- プログラムで対処することを求められていないから
- キャッチして処理をすることは可能
その他 例題
例題1
public class Main {
public static void main(String[] args) {
System.out.println(test(null));
}
private static String test(Object obj) {
try {
System.out.println(obj.toString());
} catch (NullPointerException e) {
return "A";
} finally {
System.out.println("B");
}
return "C";
}
}
// 結果
// B A
// catchブロックでreturnしても、戻る前にfinallyブロックが必ず実行される
例題2
public class Main {
public static void main(String[] args) {
try {
try {
String[]array = {"A", "B", "C"};
System.out.println(array[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("D");
} finally {
System.out.println("E");
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("F");
} finally {
System.out.println("G");
}
}
}
// 結果
// D E G