Java
PR

Javaの例外処理とは?try-catchの書き方や使い方をわかりやすく解説

dream2020
記事内に商品プロモーションを含む場合があります

Javaのプログラムを書くときに避けて通れない「例外処理」。

エラーが起きてもプログラムを止めずに上手に対処する方法を、初心者でもわかる言葉で丁寧に解説します。

この記事を読むことで、例外処理の基本から使い方、よくあるパターンまでしっかり理解でき、実際の開発で役立つ力が身につきます。

Javaの例外処理とは?基本の解説とサンプルコード

  • 基本の解説
  • 例外処理の基本系:try-catch文

基本の解説

Javaの例外処理とは、プログラムの中でエラー(例外)が起きたときに、プログラムを止めずにうまく対応するための仕組みです。

普通に書いたコードでエラーが起きると、プログラムはそこで止まってしまいます。これを防ぐために「例外処理」を使います。

たとえば、数字を0で割るとエラーになりますよね?このエラーが起きてもプログラムを止めずに、「0で割れませんよ」と教えてあげることができます。

例外処理の基本形:try-catch文

Javaで例外処理を書くときに一番よく使うのが「try-catch文」です。

  • try の中にエラーが起こるかもしれない処理を書きます。
  • catch の中にエラーが起こったときの対応を書くところです。
public class Example {
    public static void main(String[] args) {
        try {
            int a = 10;
            int b = 0;
            int result = a / b;  // ここでエラーが起きる(0で割り算)
            System.out.println("結果は " + result);
        } catch (ArithmeticException e) {
            System.out.println("エラー:0で割ることはできません。");
        }
        System.out.println("プログラムは続きます。");
    }
}

このコードを動かすと、「エラー:0で割ることはできません。」と表示され、プログラムが止まらずに最後の行も実行されます。

なぜ例外処理が必要なのか?

プログラムは常に正しく動くとは限りません。たとえば、

  • ファイルがないのに読み込もうとした
  • ネットワークが切れた
  • ユーザーが予期しない入力をした

こういったトラブルが起きたとき、例外処理を使わないとプログラムは突然止まってしまい、ユーザーにとっては困った体験になります。

逆に例外処理があれば、エラーを予測して回避したり、別の処理を行ったりして、プログラムを安全に動かせます。

例外の種類とその使い方

Javaの例外は大きく分けて2種類あります。

  • 1. チェック例外(Checked Exception)
  • 2. 非チェック例外(Runtime Exception)

1. チェック例外(Checked Exception)

プログラムを書いているときに、必ず処理を考えなければいけない例外です。例えばファイル操作でファイルが存在しないときの例外など。

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class FileExample {
    public static void main(String[] args) {
        try {
            File file = new File("test.txt");
            FileReader fr = new FileReader(file);
            System.out.println("ファイルが開けました");
            fr.close();
        } catch (IOException e) {
            System.out.println("ファイルが見つかりませんでした");
        }
    }
}

2. 非チェック例外(Runtime Exception)

プログラムのミスや予期しない操作で起こる例外で、必ず処理しなくてもコンパイルエラーにはなりません。例えば、上で書いた0除算の例など。

例外処理の基本構文と応用

  • 複数のcatch文で例外を分けて処理する
  • finallyで必ず実行したい処理を書く

複数のcatch文で例外を分けて処理する

一つのtryの中で複数の例外が起こるかもしれないとき、それぞれに応じて処理を変えられます。

try {
    // 複数のエラーが起こり得る処理
} catch (IOException e) {
    System.out.println("ファイル操作でエラーが起きました");
} catch (ArithmeticException e) {
    System.out.println("計算でエラーが起きました");
}

finallyで必ず実行したい処理を書く

例外が起きても起きなくても、必ず実行したい処理はfinallyに書きます。たとえばファイルを閉じる処理など。

FileReader fr = null;
try {
    fr = new FileReader("test.txt");
    // ファイル読み込み処理
} catch (IOException e) {
    System.out.println("ファイル読み込みエラー");
} finally {
    if (fr != null) {
        try {
            fr.close();
        } catch (IOException e) {
            System.out.println("ファイルを閉じるときにエラー");
        }
    }
}

例外を自分で作る(カスタム例外)

自分でルールに合わない時に例外を作って処理することもできます。これは大きなシステムを作るときに役立ちます。

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

public class CustomExceptionExample {
    public static void checkScore(int score) throws MyException {
        if (score < 0 || score > 100) {
            throw new MyException("スコアは0から100の間でなければなりません");
        }
    }

    public static void main(String[] args) {
        try {
            checkScore(120);
        } catch (MyException e) {
            System.out.println("例外発生: " + e.getMessage());
        }
    }
}

例外処理のベストプラクティス

  1. 例外は適切に捕まえる(catchする)
     必要なところだけで例外処理を書き、安易にcatchして何もしないのはやめましょう。
  2. エラーメッセージはわかりやすく
     ユーザーや開発者が原因をすぐ理解できるように書くこと。
  3. 無理に例外で制御しない
     例えば、nullチェックや条件分岐で回避できるならそちらを優先します。
  4. finallyでリソースを必ず解放する
     ファイルやデータベースの接続などは必ず閉じること。
  5. 例外は必要に応じて再スローする
     上位の処理に任せたい場合はthrowを使います。

演習問題

  • 問題1:catch文でエラーメッセージを表示しよう
  • 問題2:ファイル読み込み時の例外処理を実装しよう
  • 問題3:数値が負の時に例外を投げるメソッドを作成しよう

問題1:catch文でエラーメッセージを表示しよう

次のコードで起きる例外を予測し、catch文を使ってエラーメッセージを表示するコードを書いてください。

int[] numbers = {1, 2, 3};
System.out.println(numbers[5]);

解答例

try {
    int[] numbers = {1, 2, 3};
    System.out.println(numbers[5]);
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("配列の範囲外を参照しています。");
}

問題2:ファイル読み込み時の例外処理を実装しよう

ファイルを読み込む処理で例外を処理し、ファイルがなかったら「ファイルがありません」と表示するコードを書いてください。

解答例

import java.io.FileReader;
import java.io.IOException;

try {
    FileReader fr = new FileReader("data.txt");
    fr.close();
} catch (IOException e) {
    System.out.println("ファイルがありません");
}

問題3:数値が負の時に例外を投げるメソッドを作成しよう

自分で例外クラスを作り、数値が負の時に例外を投げるメソッドを作ってください。

解答例

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

public static void checkNumber(int num) throws NegativeNumberException {
    if (num < 0) {
        throw new NegativeNumberException("負の数は許可されていません");
    }
}

try {
    checkNumber(-5);
} catch (NegativeNumberException e) {
    System.out.println(e.getMessage());
}

よくある質問(FAQ)

  • Q1: 例外処理を書かなくてもプログラムは動きますか?
  • Q2: try-catch文はどこに書けばいいですか?
  • Q3: finallyは必ず必要ですか?
  • Q4: 例外を無視してもいいですか?
  • Q5: 自分で例外を作る意味は何ですか?

Q1: 例外処理を書かなくてもプログラムは動きますか?

A: はい、動きますが例外が起きたときにプログラムが止まってしまうので、使うべきです。

Q2: try-catch文はどこに書けばいいですか?

A: エラーが起きそうな処理のまわりに書くのが基本です。大きな範囲に書くとエラーがわかりにくくなります。

Q3: finallyは必ず必要ですか?

A: 必須ではありませんが、リソースの解放など、必ず実行したい処理があるときに使います。

Q4: 例外を無視してもいいですか?

A: 基本的に良くないです。無視するとバグの原因になったり、問題が起きた時に対処できません。

Q5: 自分で例外を作る意味は何ですか?

A: システムのルール違反や特殊なエラーをわかりやすく管理できるからです。開発規模が大きいと便利です。

まとめ

ここまで読んでいただければ、Javaの例外処理の基本から応用までしっかり身につくはずです。

例外処理を使いこなして、より安全で信頼できるプログラムを作っていきましょう。

ABOUT ME
記事URLをコピーしました