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

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());
}
}
}
例外処理のベストプラクティス
- 例外は適切に捕まえる(catchする)
必要なところだけで例外処理を書き、安易にcatchして何もしないのはやめましょう。 - エラーメッセージはわかりやすく
ユーザーや開発者が原因をすぐ理解できるように書くこと。 - 無理に例外で制御しない
例えば、nullチェックや条件分岐で回避できるならそちらを優先します。 - finallyでリソースを必ず解放する
ファイルやデータベースの接続などは必ず閉じること。 - 例外は必要に応じて再スローする
上位の処理に任せたい場合は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の例外処理の基本から応用までしっかり身につくはずです。
例外処理を使いこなして、より安全で信頼できるプログラムを作っていきましょう。