[備忘録 その１６] Java Silver ～例外～

# 例外
Javaの例外処理は、プログラムの実行中に発生するエラーや異常な状況を処理するためのメカニズムです。例外が発生すると、通常のプログラムの流れが中断され、その例外を処理するためのコードが実行されます。これにより、プログラムが予期しない動作をすることを防ぎ、適切なエラーハンドリングを行うことができます。

### 1\.例外の基本
例外とは、プログラムの実行中に発生する異常な状態を示すオブジェクトです。Javaの例外はすべて、java.lang.Throwableクラスのサブクラスであり、主に2つのタイプに分類されます。
#### 例外にタイプ
__1\. チェック例外：__
* コンパイル時にチェックされる例外です。チェック例外が発生する可能性のあるコードは、必ず例外を処理するか、メソッドシグネチャにthrowを使って宣言する必要があります。
* 例：IOException, SQLException

__2\. 実行時例外：__
* 実行時に発生する例外で、コンパイル時にチェックされません。プログラムのロジックの問題やバグによって引き起こされることが多く、例外処理は任意です。
* 例: NullPointerException, ArrayIndexOutOfBoundsException

__3\. エラー：__
* Java仮想マシン(JVM)の内部エラーやリソース不足など、プログラムによって通常は回復できない重大な問題を表します。これらは通常、アプリケーションでキャッチするべきではない。
* 例: OutOfMemoryError, StackOverflowError

### 2\.例外処理の基本構文
例外処理は、try-catch-finallyブロックを使って行います。
* tryブロック：例外が発生する可能性のあるコードを囲みます。
* catchブロック：例外が発生したときに、その例外をキャッチして処理するためのコードを記述します。
* finallyブロック：例外の有無にかかわらず、必ず実行されるコードを記述します。主にリソースの開放に使用されます。
```java
try {
    // 例外が発生する可能性のあるコード
    int result = 10 / 0;  // 例外が発生する
} catch (ArithmeticException e) {
    // 例外がキャッチされた場合の処理
    System.out.println("ゼロで割ることはできません: " + e.getMessage());
} finally {
    // 常に実行されるコード
    System.out.println("try-catchブロックの終了");
}
```
### 3\.throwsによる例外のスロー
メソッドが例外を発生させる可能性がある場合、そのメソッドシグネチャにthrowsキーワードを使用して、どの例外がスローされるかを宣言します。
```java
public void readFile(String fileName) throws IOException {
    FileReader file = new FileReader(fileName);
    BufferedReader fileInput = new BufferedReader(file);

    // ファイルの読み取り処理
    fileInput.close();
}
```
### 4\.カスタム例外
必要に応じて、独自の例外クラスを作成することもできます。これにより、アプリケーションの特定のエラーを表す例外を定義できます。
```java
public class CustomException extends Exception {
    public CustomException(String message) {
        super(message);
    }
}

public class Example {
    public void testMethod() throws CustomException {
        throw new CustomException("カスタム例外が発生しました");
    }
}
```
### 5\.例外のチェーン
例外のチェーンを使用すると、例外の原因を追跡できます。これは、1つの例外が別の例外を引き起こした場合に、それの関係を保持するために使用されます。
```java
try {
    methodThatThrowsIOException();
} catch (IOException e) {
    throw new CustomException("新しい例外が発生しました", e);
}
```
### 6\.例外処理のベストプラクティス
* __適切な例外クラスを使用する：__ 例外が発生した原因に応じて、適切な例外クラスを使用することで、エラーハンドリングより意味のあるものになります。

* __例外メッセージを詳細にする：__
例外が発生した原因を説明するメッセージを含めることで、デバックや問題の特定が容易になります。

* __リソースの解放にfinallyまたはtry-with-resourcesを使用する：__
リソースの開放を忘れないように、finallyブロックやtry-with-resources構文を使用します。

* __特定の例外をキャッチする：__
catchブロックでは、汎用的なExceptionをキャッチするのではなく、特定の例外をキャッチするようにします。

# 例外クラス
Javaの例外は、プログラムの自己中に発生する異常な状況を表すために使用されます。これらのクラスは、Javaの標準ライブラリに組み込まれており、例外処理メカニズムの一部として機能します。例外クラスを理解することで、プログラムのエラーにより適切にハンドリングできるようになります。

### 1\. 例外クラスの基本
すべての例外クラスは、java.lang.Throwableクラスを基にしています。Throwableクラスには、2つの主要なサブクラスがあります：
* Exception: 通常のアプリケーションレベルの例外を表します。Exceptionクラス自体はされに、チェック例外と実行時例外に分けられます。

* Error： JVMのエラーやリソース不足など、通常アプリケーションでは回復不可能なエラーを表します。アプリケーションコードでこれをキャッチすることは一般的ではありません。

### 2\.Exception
Exceptionクラスのサブクラスは、特定の種類の例外を表すために使われます。主なサブクラスは次の通りです：
#### チェック例外
* IOException: 入出力操作中に発生する例外です。ファイルの読み書きやネットワーク通信などでよく使われます。

* SQLException: データベースアクセス中に発生する例外です。

* ClassNotFoundException: クラスの動的ロードに失敗した場合にスローされます。

#### 実行時例外
* NullPointerException: Null参照にアクセスした際に発生します。

* ArrayIndexOutOfBoundsException: 配列の無効なインデックスにアクセスしようとし場合に発生します。

* ArithmeticException: 数学的な計算中にエラー(ゼロ除算など)が発生した場合にスローされます。

#### Error
* utOfMemoryError: JVMがメモリ不足に陥ったときに発生します。

* StackOverflowError: 再起呼び出しが深すぎる場合などに発生します。


最初のページ
[[備忘録 その１] Java Silver ～Javaプログラミング基礎～](https://qiita.com/MagicShowTime/items/9fcf3a2cb4a7162aafcf "[備忘録 その１] Java Silver ～Javaプログラミング基礎～")

前のページ
[[備忘録 その１５] Java Silver ～継承とポリモフィズム その４～](https://qiita.com/MagicShowTime/items/ad41ae1e51011faa537f "[備忘録 その１５] Java Silver ～継承とポリモフィズム その４～")

次のページ
[[備忘録 その１７] Java Silver ～モジュールシステム～](https://qiita.com/MagicShowTime/items/e7c35de0ab0dfa3d59aa "[備忘録 その１７] Java Silver ～モジュールシステム～")