Javaのエラーと例外処理
エラーは通常、プログラムが回復できない問題を示すため、プログラムは実行を中止します。
例外はプログラムの実行を中止せず、適切な対処を行うことができます。
エラーには修正できるエラーと予測できないエラーがありマス。
エラーの種類
文法エラー
プログラムの文法が正しくない場合に発生するエラーです。
コンパイラがプログラムを解析する際に検出され、コンパイルエラーになります。
入力ミスとかですね。
例
public class Main {
public static void main(String[] args) {
// 文法エラー
int number = 1;
number = 1.2; // 型が異なる
}
}
論理エラー
プログラムのロジックに誤りがある場合に発生するエラーです。
コンパイラでは検出できないため、プログラムを実行したときに初めて発生します。
これは・・・人力で探すしかないか。
実行時エラー
プログラムの実行中に発生するエラーです。
コンパイラでは検出できないため、プログラムを実行したときに初めて発生します。
この前に見たゲーム開発の現場は地獄だったなぁ。。。
例外的状況
例外は、実行時エラーの中でもプログラムの実行を継続することは可能であるが、想定外の状況が発生したために、正常に処理できないエラーです。
例外が発生した場合、プログラムは例外処理によって処理します。
例外処理
ある程度実行時エラーが発生すると予測される場合、例外処理を記述することでプログラムを正常に終了させて、エラーが発生した原因を特定、適切な処理を施すことができます。
例外処理の流れデス。
- tryブロックで、エラーが発生する可能性がある処理を記述します。
- catchブロックで、発生したエラーをキャッチします。
- finallyブロックで、最終処理を行います。
try {
// 例外が発生する可能性のあるコード
} catch (ExceptionType e) {
// 例外の処理
} finally {
// 例外の発生有無に関係なく実行される処理
}
try-catch-finally ブロックtry-catch-finally
ブロックは、プログラムの実行中に例外が発生する可能性があるコードを包むために使用されます。
このブロックは以下の要素で構成されます。
trytry
ブロック内には例外が発生する可能性のあるコードが配置されます。
例外が発生すると、プログラムの実行は try
ブロック内のコードから中断され、対応する catch
ブロックにスローされます。
catchcatch
ブロック内には特定の例外を処理するコードが配置されます。
例外がスローされた場合、該当する catch
ブロックが実行され、例外の種類に応じた処理を行うことができます。
finallyfinally
ブロック内のコードは、例外の発生有無に関係なく実行されます。
一般的に、リソースの解放や後処理に使用されます。
例
以下のコードは、ファイルが存在しない場合に例外が発生するコードです。
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 | 数値に変換できないエラーを表す例外クラス |
NullPointerException | null 参照を操作しようとしたエラーを表す例外クラス |
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
ブロックでキャッチしてエラーメッセージを表示しています。