2
0

More than 1 year has passed since last update.

Java Silver SE11 10章

Last updated at Posted at 2022-02-25

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-catchthrows句はする必要がない (記述は可能)

例外クラス

問題で出題された例外クラスをまとめる。

例外クラス 内容
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
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0