【例外の処理】

## はじめに
オラクル認定資格教科書 Javaプログラマ Silver SE８
第一章　Javaの基本　
第二章　Javaのデータ型の操作
第三章　演算子と判定構造の使用
第四章　配列の作成と使用
第五章　ループ構造の使用
第六章　メソッドとカプセル化の操作
第七章　継承の操作
第八章　例外の処理←　ｲﾏｺｺ！！
第九章　Java APIの主要なクラスの操作

## 例外とは
　例外とはプログラム実行時に発生する予期せぬエラーのこと。
　例外は「エラー（Error）」と「例外（Exception）」に区別され、その違いはプログラムで対処できるかできないかにある。
　**エラー** → プログラムで対処できない致命的な例外
　**例外** → プログラムで対処できる例外
　例外はさらに**検査例外**（Exception）と**非検査例外**（RuntimeException）に分けられる。
　検査例外とは、例外処理を記述したかどうかをコンパイラが検査する例外。
　非検査例外とは、例外処理を記述したかコンパイラーが検査しない例外。（記述してもしなくてもOK）

 Exceptionクラスのサブクラスは、RuntimeExceptionとそのサブクラスを除いて、すべて検査例外である。そのため、Exceptionクラスを継承している例外クラスは、try-catchしているか、もしくはthrows句で宣言しているかのどちらかを強制される。

## 例外処理
・try-catchを使う方法
・throwsを使う方法
### try-catch文
 例外が発生する可能性がある処理をtryブロックで括り、例外で発生したときの処理をcatchブロックに記述する。
 catchブロックは複数記述可能（例外の種類を分けられる）
```java
try {
  // 例外が発生する可能性のある処理
} catch (例外クラス型 変数) {
  // 例外が発生したときの処理
}
```
#### try-catch-finally文
　例外発生の有無に関わらず、必ず実行したい処理を記述するのがfinallyブロック。
　例外が発生しない場合　try → finally
　例外が発生した場合　try → catch → finally
```java
try {
  // 例外が発生する可能性のある処理
} catch (例外クラス型 変数) {
  // 例外が発生したときの処理
} finally {
  // 例外発生の有無に関わらず実行したい処理
}
```
 catchブロック内に呼び出し元へ制御を戻すreturn文がある場合、その前にfinallyブロックが実行される。
（finallyが実行される前に制御は戻されないが、returnする内容はすでに仮想の変数にセットされている。書き換えたい場合はfinallyでreturn文を使って上書きが必要。）
 catchブロックとfinallyブロックの両方にreturn文がある場合、finallyのreturnが返却される。

### throws宣言
　throwsはメソッド内で例外が発生した場合、自身のメソッド内でcatchするのではなく、呼び出し元に例外を投げる処理。
```java
private void メソッド名() throws 例外{
  // なにかしらの処理
}
```

```java
public static void sample() throws IOException{
  FileWriter fw = new FileWriter("date.txt");
  fw.write("hello!");
}

--------------------------------------------------

public class Main{
    public static void main(String[] args){
        try{
             sample(); // sampleメソッドからIOException例外が帰ってくる
        }catch(IOException e){
            System.out.println("入出力関係の例外が発生しました");
        }
    }
}
```
### 例外の送出(throw)
 throwを使用すると任意のタイミングで例外を発生させて、例外処理を行うことができる。
```java
throw new 例外();

あるいは

throw new 例外("メッセージ");
```

```java
Public class Person{
    int age;
    public class setAge(int Age){
        if(age <= 0){
        // 0以下だった場合
            throw new IllgalArgumentExeception("年齢は正の数にしてください。指定値=" + age);
        }
        // 正数だった場合
        this.age = age;
    }
}
```

## 例外の種類
一部のみ抜粋
**Throwable**
<dl>
  <dt>Error</dt>
    <dd>StackOverflowError　(スタック領域のオーバーフロー)</dd>
    <dd>OutOfMemoryError　(メモリの不足)</dd>
    <dd>InternalError　(内部エラー)</dd>
    <dd>ClassFormatError　(クラスファイルの破損、解釈できない)</dd>
    <dd>UnknownError　(未知の重大なエラー)</dd>
  <dt>Exception</dt>
    <dd>IOException (入出力関係の例外)</dd>
    <dd>ClassNotFoundException (クラスが見つからない)</dd>
    <dd>NoSuchFieldException (クラスに要求したフィールドがない)</dd>
    <dd>TimeoutException (ブロック操作がタイム・アウトしたとき)</dd>
    <dd>SQLException (DB系の例外)</dd>
    <dd>ConnectException (接続拒否に関連するエラー)</dd>
  <dt>RuntimeException</dt>
    <dd>NullPointerException (参照型変数にnull値が格納されている)</dd>
    <dd>NumberFormatException (文字列を数値型に変換するときに文字列が数値型に適した状態でない場合)</dd>
    <dd>IllegalArgumentException (不正な引数をメソッドに渡した)</dd>
    <dd>ArrayIndexOutOfBoundsException (配列で存在しない要素へのアクセス)</dd>
</dl>

## リンク集
[【Javaの基本①】クラスの構造](https://qiita.com/vitamin_b12/items/3f920cd223fd3cc1ceae)
[【Javaの基本②】パッケージとインポート](https://qiita.com/vitamin_b12/items/be766c8c3ef2366d9fea)
[【継承の操作②】インターフェース](https://qiita.com/vitamin_b12/items/cdc76298d7f6a494dff2)
[【Javaのデータ型の操作①】プリミティブ型のデータ・参照型](https://qiita.com/vitamin_b12/items/f922ab56e4d8b6580f49)
[【演算子と判定構造の使用①】論理演算子(&&、||)、同一性（==）、同値性(equals)](https://qiita.com/vitamin_b12/items/9feb89e8fb1bc67a8d6d)
[【演算子と判定構造の使用②】分岐処理(if、swich)](https://qiita.com/vitamin_b12/items/523467908e683474eac7)
[【配列の作成と使用】](https://qiita.com/vitamin_b12/items/2fc45588640c479e1f4d)
[【ループ構造の使用】while文、do-while文、for文、拡張for文](https://qiita.com/vitamin_b12/items/23d853dda9baf727e4ac)
[【メソッドとカプセル化の操作①】メソッドの概要](https://qiita.com/vitamin_b12/items/215ad731221c2691c441)
[【メソッドとカプセル化の操作②】オーバーロード、コンストラクタ](https://qiita.com/vitamin_b12/items/e4fd3d51a35bb6a5566c)
[【継承の操作①】クラスの継承](https://qiita.com/vitamin_b12/items/19f8ad6f9801ac8f6a8f)
[【例外の処理】](https://qiita.com/vitamin_b12/items/f7ebf2c1106a7dcbdb41)
[【Java APIの主要なクラスの操作】](https://qiita.com/vitamin_b12/items/dcd3edfe2273e5a09231)