Java SE11 Gold 対策メモ --例外処理編

# 概要

- Java SE11 Gold 試験用にまとめていた自分用メモ
- [こちらの記事](https://qiita.com/leonis_sk/items/a378fc03e79c74d4727c)を参考にSE8⇒SE11の変更点等をまとめていきます。

## 例外クラス
例外クラスは**checked例外**と**uncheked例外**の2種類に分類される。

###checked例外
+ Java実行環境以外の環境が原因で発生する例外
+ 例外処理の実装は**必須**
+ `Exception`のサブクラス

###unchecked例外
+ Java実行環境内が原因で発生する例外
+ 例外処理の実装は**任意**
+ `RuntimeException`のサブクラス
<br>※RuntimeExceptionはExceptionクラスのサブクラスであるがunchecked例外として扱う

|クラス名|例外|リファレンスリンク|
|:--|:--|:--|
|Errorクラスおよびそのサブクラス|unchecked例外|[Error](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/Error.html)
|RuntimeExceptionクラスおよびそのサブクラス|unchecked例外|[RuntimeException](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/RuntimeException.html)|
|Exceptionクラスおよびそのサブクラス|checked例外|[Exception](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/Exception.html)|

```java:java
public class Sample {
	static void methodA() throws RuntimeException {
		//static void methodA() {   // unchecked例外なのでこちらでも可能
		throw new RuntimeException();
	}
	static void methodB() throws IOException {
		//static void methodB() { // checked例外なので必須、コンパイルエラー
		throw new IOException();
	}
	public static void main(String[] args) {
		try {
			methodA();
			methodB();
		} catch(RuntimeException | IOException e) {
			System.out.println(e);
		}
	}
}

```

```text:実行結果
java.lang.RuntimeException
```

###multi-catch
+ catch(){}catch(){}catch(){}...を一命令にまとめることができる
+ `catch(IOException | RuntimeException | MyException e)`と **|** を用いて列記する
+ 継承関係のある例外クラスは列記できない
+ キャッチした参照変数は暗黙的にfinalとなる

```java:java
public class Sample {

    static void methodA() throws IOException {    //checked例外はスローが必須なので記述
        throw new IOException();
    }

    public static void main(String[] args) {
        try {
            methodA();
        } 
        //catch(Exception | IOException e){    //継承関係のある例外を列記している為コンパイルエラー
        catch(RuntimeException | IOException e) {
            //e = null;    //、暗黙的にfinalな参照変数に代入しようとしている為コンパイルエラー
            System.out.println(e);
        }
    }
}
```

###try-with-resources
+ try文のスコープから外れるとき、変数のclose()メソッドを呼び出す
+ ；セミコロンで複数宣言可能
+ `AutoCloseable`または`Closeable`インターフェースを継承している必要がある
+ ここで宣言した変数は暗黙的にfinalになる

```java:java
class MyResource implements AutoCloseable {
	private String msg;
	public MyResource(String msg) { this.msg = msg; }
	public void close() throws Exception {
		System.out.println("close() : "+ msg);
	}
}

public class Sample {
	public static void main(String[] args) {
		try (MyResource obj1 = new MyResource("obj1");
				MyResource obj2 = new MyResource("obj2")) {
			//obj1 = null;    //暗黙的finalな為、コンパイルエラー
			System.out.println("try ブロック内の処理");
			throw new SQLException();
		} catch (SQLException e) {
			System.out.println("catch ブロック：SQLException");
		} catch (Exception e) {
			System.out.println("catch ブロック：Exception");
		} finally {
			System.out.println("finally ブロック");
		}
	}
}

```
```text:実行結果
try ブロック内の処理
close() : obj2
close() : obj1
catch ブロック：SQLException
finally ブロック
```

####close()中のエラー
try-with-resources文には「抑制された例外」という
概念があります。
これをサポートするのが`Throwable`クラスです。
####Throwable
```java:java
class MyResource implements AutoCloseable {
	private String msg;
	public MyResource(String msg) { this.msg = msg; }
	public void method() throws SQLException {
		throw new SQLException("method() でのエラー");
	}
	public void close() throws SQLException {
		System.out.println("close() : "+ msg);
		throw new SQLException("close() でのエラー : " + msg);
	}
}
public class Sample4 {
    public static void main(String[] args) {
		try (MyResource obj1 = new MyResource("obj1");
				MyResource obj2 = new MyResource("obj2")) {
			obj1.method();
		} catch (SQLException e) {
			System.out.println("e "+ e.getMessage());
			Throwable[] errAry = e.getSuppressed();
			System.out.println("抑制例外数 : " + errAry.length);
			for(Throwable ex : errAry){
				System.out.println("ex " + ex.getMessage());
			}
		} finally {
			System.out.println("finally ブロック");
		}
	}
}
```
```text:実行結果
close() : obj2
close() : obj1
e method() でのエラー
抑制例外数 : 2
ex close() でのエラー : obj2
ex close() でのエラー : obj1
finally ブロック
```

###AssertionError
+ プログラムにバグを残さないための手法一つ
+ エンドユーザの入力チェックなどには用いない
+ 事前条件が定まっているプログラムに使用する
+ -ea(enable assertion)で有効
+ -da(disable assetion)で無効--default

```java:java
class Test {
	private int check(int point) {
		assert (point > 0) : point + " メッセージをつけることができる";
		//assert point > 0; // ok
		//assert(point > 0); // ok
		return point * 100;
	}
	int method(int point) {
		return check(point);
	}
}
public class Sample {
	public static void main(String[] args) {
		System.out.println(new Test().method(-1));
	}
}
```
`java Sample`

```text:実行結果
-100
```

`java -ea Sample`

```text:実行結果
Exception in thread "main" java.lang.AssertionError: -1
```

# 参考書
[オラクル認定資格教科書 Javaプログラマ Gold SE11](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Gold-SE11%EF%BC%88%E8%A9%A6%E9%A8%93%E7%95%AA%E5%8F%B71Z0-816%EF%BC%89-%E5%B1%B1%E6%9C%AC-ebook/dp/B08P55ZJNY/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=java+gold&qid=1624931447&sr=8-3)
[徹底攻略Java SE 8 Gold問題集](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-8-Gold%E5%95%8F%E9%A1%8C%E9%9B%86%EF%BC%BB1Z0-809%EF%BC%BD%E5%AF%BE%E5%BF%9C-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B01LXSG1G9/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=java+gold&qid=1624931447&sr=8-4)