Javaプログラミングにおけるエラーと例外処理

Javaプログラミングにおけるエラーと例外処理
目次

Javaのエラーと例外処理

エラーは通常、プログラムが回復できない問題を示すため、プログラムは実行を中止します。
例外はプログラムの実行を中止せず、適切な対処を行うことができます。

ロボ君

エラーには修正できるエラーと予測できないエラーがありマス。

エラーの種類

文法エラー

プログラムの文法が正しくない場合に発生するエラーです。
コンパイラがプログラムを解析する際に検出され、コンパイルエラーになります。

りある

入力ミスとかですね。

public class Main {
    public static void main(String[] args) {
        // 文法エラー
        int number = 1;
        number = 1.2; // 型が異なる
    }
}

論理エラー

プログラムのロジックに誤りがある場合に発生するエラーです。
コンパイラでは検出できないため、プログラムを実行したときに初めて発生します。

りある

これは・・・人力で探すしかないか。

実行時エラー

プログラムの実行中に発生するエラーです。
コンパイラでは検出できないため、プログラムを実行したときに初めて発生します。

りある

この前に見たゲーム開発の現場は地獄だったなぁ。。。

例外的状況

例外は、実行時エラーの中でもプログラムの実行を継続することは可能であるが、想定外の状況が発生したために、正常に処理できないエラーです。
例外が発生した場合、プログラムは例外処理によって処理します。

例外処理

ある程度実行時エラーが発生すると予測される場合、例外処理を記述することでプログラムを正常に終了させて、エラーが発生した原因を特定、適切な処理を施すことができます。

ロボ君

例外処理の流れデス。

  1. tryブロックで、エラーが発生する可能性がある処理を記述します。
  2. catchブロックで、発生したエラーをキャッチします。
  3. finallyブロックで、最終処理を行います。
   try {
       // 例外が発生する可能性のあるコード
   } catch (ExceptionType e) {
       // 例外の処理
   } finally {
       // 例外の発生有無に関係なく実行される処理
   }

try-catch-finally ブロック
try-catch-finally ブロックは、プログラムの実行中に例外が発生する可能性があるコードを包むために使用されます。
このブロックは以下の要素で構成されます。

try
try ブロック内には例外が発生する可能性のあるコードが配置されます。
例外が発生すると、プログラムの実行は try ブロック内のコードから中断され、対応する catch ブロックにスローされます。

catch
catch ブロック内には特定の例外を処理するコードが配置されます。
例外がスローされた場合、該当する catch ブロックが実行され、例外の種類に応じた処理を行うことができます。

finally
finally ブロック内のコードは、例外の発生有無に関係なく実行されます。
一般的に、リソースの解放や後処理に使用されます。

以下のコードは、ファイルが存在しない場合に例外が発生するコードです。

import java.io.*;

public class Main {
    public static void main(String[] args) {
        try {
            File file = new File("myfile.txt");
            FileReader reader = new FileReader(file);

            int character;
            while ((character = reader.read()) != -1) {
                System.out.print((char) character);
            }

            reader.close();
        } catch (FileNotFoundException e) {
            System.out.println("ファイルが存在しません。");
        } catch (IOException e) {
            System.out.println("ファイルの読み込み中にエラーが発生しました。");
        } finally {
            System.out.println("終了処理です。");
        }
    }
}

↓実行結果

ファイルが存在しません。
終了処理です。

このコードでは、try ブロックでファイルオブジェクトを作成しています。
ファイルオブジェクトの read() メソッドを実行すると、ファイルが存在しない場合に例外が発生します。
この例外は、catch ブロックで処理されます。
catch ブロックでは、エラーメッセージを出力しています。
finally ブロックでは、終了処理を実行しています。

例外クラス

Java には、実行時エラーを表現するための例外クラスが用意されています。
例外クラスは、java.lang パッケージに定義されています。

例外クラスの例説明
Exceptionすべての例外クラスのスーパークラス
RuntimeException予期しないエラーを表す例外クラス
IOException入出力エラーを表す例外クラス
NumberFormatException数値に変換できないエラーを表す例外クラス
NullPointerExceptionnull 参照を操作しようとしたエラーを表す例外クラス
ArrayIndexOutOfBoundsException配列の範囲外を参照しようとしたエラーを表す例外クラス

例外インスタンス

例外クラスは java.lang.Exception クラスを継承したり、特定の例外の種類に合わせてカスタム例外クラスを作成することができます。
これらの例外クラスは、例外の種類と詳細情報を格納するために使用されます。
例外インスタンス(Exception Instance)は、Javaプログラミングにおいて例外を表現するオブジェクトです。
例外はプログラムの実行中に発生するエラー状況を示し、それらの情報を保持するために例外インスタンスが使用されます。

例外インスタンスの作成

例外インスタンスは、例外クラスのコンストラクタを呼び出して生成されます。
コンストラクタは例外の詳細情報を受け取り、その情報をインスタンス変数に格納します。

public MyException(String message) {
    super(message);
}

このコンストラクタは MyException というカスタム例外クラスのインスタンスを生成し、エラーメッセージを指定します。

例外インスタンスのスロー

例外インスタンスは、プログラム内で例外の状況が発生した際に throw キーワードを使用してスローされます。
例外がスローされると、プログラムの実行は中断され、対応する例外ハンドラ(catch ブロック)で処理されるか、呼び出し元に伝播されます。

throws キーワード

throws キーワードは、メソッド定義において、そのメソッドがスローする可能性のある例外を宣言するために使用されます。
メソッドが特定の例外をスローする場合、それをそのメソッドで宣言することにより、メソッドを呼び出す側に対して例外を投げることができます。

   public void myMethod() throws MyException {
       // メソッドのコード
   }

上記の例では、myMethod メソッドが MyException という例外をスローする可能性があることが宣言されています。
呼び出す側のコードで、この例外をキャッチするために try-catch ブロックを使用する必要があります。

例外インスタンスの利用

例外インスタンスは例外の種類やエラーメッセージを含んでおり、エラー情報をデバッグおよびエラーログに記録する際に役立ちます。
また、エラーメッセージをカスタマイズすることで、プログラムのユーザーに対して適切なエラーメッセージを提供することも可能です。

以下は、カスタム例外クラスと例外インスタンスの例です。

public class Main {

    public static class MyException extends Exception {
        public MyException(String message) {
            super(message);
        }
    }

    public static void main(String[] args) {
        try {
            throw new MyException("これはカスタム例外です");
        } catch (MyException e) {
            System.out.println("例外がキャッチされました: " + e.getMessage());
        }
    }
}

↓実行結果

例外がキャッチされました: これはカスタム例外です

この例では、MyException クラスの例外インスタンスをスローし、catch ブロックでキャッチしてエラーメッセージを表示しています。

教科書

Pythonの教科書は「やさしいPython」です。

Javaの教科書は「スッキリわかるJava入門 実践編 第3版」です。

著:中山清喬, 著:国本大悟, 監修:株式会社フレアリンク
¥2,680 (2024/04/28 18:03時点 | Amazon調べ)

SQLの教科書は「スッキリわかるSQL入門第3版」です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次