Java基礎 第19回『例外クラス(try-catch文)』

目次

記事について

Java基礎 第18回はJavaにおける日付について解説しました。
この記事は、プログラミングにおける”例外処理”という重要な概念に焦点を当てたもので、特にJavaの『 例外クラス 』について詳しく解説しています。例外処理はプログラムが予期しない問題に遭遇した際にどのように対応するかを管理するためのもので、Javaでは特殊なクラスを提供してその役割を果たしています。

記事は、例外とその類型、Javaの例外クラスとその使用例、例外の処理方法(try-catch文、throw、throws)、そして自作の例外クラスの作り方について深く掘り下げています。それぞれの例外型に対する具体的な対処法や例外を発生させる方法について、実際のコードを通じて理解することができます。

Javaを学び、そのエラー処理により深く踏み込むために必要な知識を得たいプログラマーにとって、この記事はとても役に立つ内容となっています!

はじめに

プログラミングの世界では、事前に予想できない問題が頻繁に発生します。これらの問題はしばしば「例外」と呼ばれます。例外処理は、これらの予想外の問題に対処するための一連の処理で、Javaでは例外処理を行うための特別なクラスを提供しています。今回は、Javaの例外クラスについて詳しく見ていきましょう。

 例外とは?

例外とは、プログラムが実行中に遭遇する予期せぬ事象を指します。ファイルが存在しない、データベースへの接続が失われる、メモリが不足するなど、例外はさまざまな形で発生します。これらの問題に適切に対処しないと、プログラムは予期せぬ結果を引き起こすか、最悪の場合、クラッシュする可能性があります。

Javaの例外クラス

Javaは、これらの例外を表現するための特別なクラス、すなわち例外クラスを提供しています。Javaで例外を扱うための基本クラスは java.lang.Exception です。

以下に、一部の例外クラスを紹介します。

  • Exception:全てのチェック例外の基本クラス
  • RuntimeException:全ての非チェック例外の基本クラス
  • NullPointerException:nullのオブジェクトに対してアクセスしたときに発生する例外
  • IndexOutOfBoundsException:配列などの範囲を超えてアクセスしたときに発生する例外
  • FileNotFoundException:存在しないファイルにアクセスしようとしたときに発生する例外
  • IOException:入出力処理に問題があったときに発生する例外
  • NumberFormatException:数字に変換できない文字列を変換しようとしたときに発生する例外
  • SQLException:データベース操作で問題が発生したときに発生する例外

例外の種類

Javaの例外は大きく3つに分類されます。それがチェック例外、非チェック例外、エラーです。

  • チェック例外(Checked Exceptions): コンパイル時に検出される例外で、プログラマが明示的に対処を行わなければならない例外。例えば FileNotFoundException がこれに該当します。
  • 非チェック例外(Unchecked Exceptions): 実行時にのみ検出される例外で、プログラムのバグが原因となることが多い。NullPointerException や ArrayIndexOutOfBoundsException など。
  • エラー(Errors): Javaシステムの内部エラーやリソース不足といった重大な問題を表す。エラーはプログラマが処理を書くことは通常ありません。

例外処理の基本

Javaでは、例外が発生した場合に、その例外をキャッチして適切に処理するための構文を提供しています。それが try-catch ブロックです。以下に、try-catch ブロックの基本的な使い方を示します。

try {
    // 例外が発生する可能性があるコード
} catch (ExceptionType1 e) {
    // ExceptionType1が発生した時の処理
} catch (ExceptionType2 e) {
    // ExceptionType2が発生した時の処理
}

この例では、まず try ブロック内のコードが実行され、もし指定された例外が発生すれば対応する catch ブロックが実行されます。この際、それぞれの catch ブロックは特定の例外型に関連付けられています。それにより、発生した例外の種類に応じて異なる処理を行うことができます。

例外のスロー (throw)

プログラムの制御フローの一部として、または何かが間違っているときに他のコードに知らせるために、Javaでは例外を「スロー」することができます。Javaでは、throwキーワードを使用してこれを行います。throwの後には、スローされる例外オブジェクトを指定します。

以下に基本的な使い方を示します。

throw new IllegalArgumentException("Invalid argument was passed.");

上記のコードでは、新しいIllegalArgumentExceptionを作成し、それをスローしています。この例外は、不適切な引数がメソッドに渡されたときに通常スローされます。この例外をスローすると、現在のメソッドの実行はすぐに停止し、例外をキャッチする最初のcatchブロックに制御が移ります。

スローされる例外は、必ずしもJava言語が提供する例外である必要はありません。自分自身で定義したカスタム例外をスローすることも可能です。

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

public void checkSomething(String value) throws MyException {
    if (value == null) {
        throw new MyException("Value should not be null");
    }
    // 何かの処理
}

このコードでは、まずMyExceptionというカスタム例外クラスを定義しています。次に、この例外をスローするcheckSomethingメソッドを定義しています。このメソッドは、valueがnullである場合にMyExceptionをスローします。

例外の宣言 (throws)

Javaでは、メソッドが特定の例外をスローする可能性があることを呼び出し元に明示的に知らせるためにthrowsキーワードを使用します。これは、そのメソッドがスローする例外を呼び出し元が適切に処理できるようにするための重要なステップです。

public void readFile(String fileName) throws IOException {
    // ファイルを開いて読み込む処理
}

この例では、readFileメソッドがIOExceptionをスローする可能性があることを宣言しています。これにより、このメソッドを呼び出す他のコードは、IOExceptionを適切にキャッチして処理する準備をすることができます。

呼び出し元は、以下のようにtry-catch文を使って例外をキャッチし、適切に処理を行います。

try {
    readFile("somefile.txt");
} catch(IOException e) {
    // 例外がスローされたときの処理
    System.out.println("Failed to read the file.");
}

throwとthrowsの主な違いは、throwは実際に例外をスローする行為を行い、throwsはメソッドが特定の例外をスローする可能性を示すことです。例外を適切に処理するためには、これらのキーワードを適切に使い分けることが重要です。

例外の自動クローズ(try-with-resources)

Java 7から導入されたtry-with-resources文は、リソースのクローズを自動化し、リソースリークを防ぐための方法を提供します。これは、クローズ可能なリソース(ファイル、ネットワーク接続、データベース接続など)を使用する際に非常に便利です。

try-with-resources文を使用すると、Javaはtryブロックが終了したときにリソースを自動的にクローズします。これにより、開発者は手動でクローズを呼び出す必要がなくなり、リソースリークやその他の関連する問題を避けることができます。

try-with-resources文の基本的な形式は以下の通りです。

try (Resource resource = new Resource()) {
    // リソースを使用する処理
} catch (Exception e) {
    // 例外の処理
}

この例では、Resourceクラスのインスタンスが作成され、そのリソースがtryブロックで使用されます。ブロックが終了すると、Javaは自動的にresource.close()を呼び出してリソースを適切にクローズします。

具体的な使用例として、ファイルの読み込みを行う場合を見てみましょう。

try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

このコードでは、ファイルを開いて読み込み、その内容を表示しています。try-with-resources文を使用しているため、ファイルのクローズ処理は自動的に行われます。これにより、例外が発生してもリソース(この場合はファイル)が確実に閉じられ、リソースリークを防ぐことができます。

try-with-resourcesは、エラーハンドリングのコードをよりクリーンにし、リソースの管理を効率的にするための強力なツールです。リソースを使用するすべての場面でこの文を使用することを検討することを強くお勧めします。

カスタム例外クラスの作成

Javaでは、自分自身で定義した例外クラスを作成することも可能です。これは、プログラムの特定の状況を表すために役立ちます。カスタム例外クラスを作成するには、既存の例外クラス(通常は Exception または RuntimeException)を拡張します。

以下に、簡単なカスタム例外クラスの例を示します。

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

この例では、MyException という新しい例外クラスを定義しています。この例外は、任意のメッセージとともにスローすることができます。次に、このカスタム例外を使用する例を示します。

Copy code
public void doSomething(int value) throws MyException {
    if (value < 0) {
        throw new MyException("Value must not be negative");
    }
    // 何らかの処理
}

この例では、doSomething メソッド内で値が負である場合に MyException をスローしています。これにより、このメソッドを呼び出す他のコードは、この独自の条件に適切に対処することが可能となります。

まとめ

例外処理は、Javaプログラミングにおける非常に重要なトピックです。適切な例外処理を書くことで、プログラムが予期せぬ問題に遭遇した際にも、それを適切に処理し、プログラムの安全性と信頼性の高いコードを作成することができます。

最初はどのように使うのか使用シーンなどがイメージできないかもしれませんが、まずは例外処理の引き出しをストックしておきましょう。

次回はファイル操作について紹介していきます。
ファイル操作で、今回の連載は終了です。Javaについて本当に長い旅でしたが、もう一息です!
一緒に頑張りましょう!

(Visited 270 times, 1 visits today)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社NEUGATEは、都内で企業研修や職業訓練を運営している会社です。主に、IT系の教育事業に力を入れています。
この記事は、株式会社NEUGATEの教育事業部が執筆をしています。

企業ホームページ:https://neugate.co.jp/

コメント

コメントする

目次