Javaのプログラミングにおいて、try-catch構文は例外処理の基本となる重要な要素です。しかし、この構文をどのように使い分ければ良いのか、コツを掴めず理解に苦しんでいる方は多いでしょう。
本記事ではJavaのtry-catch構文の基本から応用まで、さまざまなパターン別にその書き方を詳しく解説します。初心者でも理解しやすい一般的な書き方から、複数の例外が発生した場合の対処法、さらには高度な使い方まで具体的なコード例を交えてご紹介します。
Javaのtry-catchとは?
Javaにおけるtry-catch構文は、プログラム実行時に発生する可能性のある例外を捕捉し、適切に処理するために使用されます。わかりやすく言うと、プログラムがエラーを起こしたときに、そのエラーをちゃんと受け止めて安全に処理するための仕組みです。
さまざまな構成要素があり、それを一覧表でまとめたものが以下です。
| 構成要素名 | 特徴・使用シーン |
| tryブロック |
|
| catchブロック |
|
| finallyブロック |
|
| throw |
|
| throws |
|
Javaのtry-catchはどう書く?パターン別に紹介
この章では、具体的にどう書くのか、以下のパターンごとにくわしく解説していきます。
- 一般的な書き方
- 例外となった場合
- 例外がたくさんある場合
- try-catch内にtry-catchを書く場合
- throwの使い道
- finallyブロックについて
パターン①一般的な書き方

一般的な書き方は、以下のとおりです。
// ここに例外が生まれそうな処理
} catch (ここでキャッチする例外の型と、例外の変数名) {
// 例外が生まれた時の処理
}
実際のコードで解説します。以下のように、0で割り算するコードを書いてしまうとエラーになりますが、try-catchを使えば安全に処理できます。
public static void main(String[] args) {
try {
int result = 10 / 0; // エラーが起きる場所
} catch (ArithmeticException e) { // エラーを捕まえる
System.out.println(“エラーが起きました:0で割ることはできません!”);
}
}
}
上記は
- tryの中にエラーが起こるかもしれないコードを書く
- catchはエラーを捕まえ、そのときに何をするかを指定する
というロジックです。
0で割ろうとしたときのエラー(ArithmeticException)を捕まえています。
パターン②例外となった場合
エラーが起きたときには、「ここは間違ってます」と教えてくれるようにできます。
public static void main(String[] args) {
try {
String text = null;
System.out.println(text.length()); // エラーが起きる場所(nullのデータに対する操作)
} catch (NullPointerException e) { // エラーを捕まえる
System.out.println(“エラーが起きました:データがありません!”);
}
}
}
textという変数がnull(何も入っていない)状態でtext.length()を呼び出すとエラーになります。
上記ではcatchでNullPointerExceptionを捕まえ、メッセージを表示しています。
パターン③例外がたくさんある場合

1つのコードでいろんな種類のエラーが起こることもあります。それをまとめて対処する方法です。
public static void main(String[] args) {
try {
int[] numbers = {1, 2, 3};
System.out.println(numbers[5]); // 配列の範囲外アクセスでエラー
int result = 10 / 0; // 0で割ろうとしてエラー
} catch (ArrayIndexOutOfBoundsException e) { // 配列エラーを捕まえる
System.out.println(“エラーが起きました:配列の範囲外です!”);
} catch (ArithmeticException e) { // 割り算エラーを捕まえる
System.out.println(“エラーが起きました:0で割ることはできません!”);
}
}
}
例外がたくさんあるときは、catchを続けて書くことで、を別々に処理できます。上記では配列の範囲外(ArrayIndexOutOfBoundsException)と、0で割るエラー(ArithmeticException)をそれぞれキャッチしています。
numbers[5]でエラーが発生した時点でcatchに移るため、10 / 0は動きます。順番に処理するのではなく、一度エラーが起きるとcatchに飛ぶ、という仕組みとなっています。
パターン④try-catch内にtry-catchを書く場合

エラー処理の中でさらに別のエラーが起きることがあります。
その場合はシンプルで、try-catchの中にまたtry-catchを書くことで、それぞれ個別に処理できます。
public class Main {
public static void main(String[] args) {
try {
int[] numbers = {1, 2, 3};
System.out.println(numbers[5]); // 配列の範囲外エラー
try {
int result = 10 / 0; // このエラーは中の try-catch で処理される
} catch (ArithmeticException e) {
System.out.println(“中のエラー:0で割ることはできません!”);
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(“外のエラー:配列の範囲外です!”);
}
}
}
配列の範囲外エラー(ArrayIndexOutOfBoundsException)が発生した時点で、外側のcatchが動きます。
中のtry-catchは実行されないままcatchに移るので、0で割るエラーは起こりません。つまり、外側で起きると内側がスキップされることになります。
パターン⑤throwの使い道

throwはプログラムの中で意図的にエラーを発生させてチェックできる機能です。記述例は以下のとおりです。
public class Main {
public static void main(String[] args) {
try {
checkAge(12); // 年齢をチェックする
} catch (IllegalArgumentException e) {
System.out.println(“エラーが起きました:” + e.getMessage());
}
}
public static void checkAge(int age) {
if (age < 18) {
throw new IllegalArgumentException(“18歳未満は利用できません!”); // 自分でエラーを起こす
}
System.out.println(“年齢確認完了:利用できます。”);
}
}
ここではcheckAge()メソッドで、年齢が18歳未満の場合にthrowで発生させています。このようなシーンでthrowを使うことで、プログラム内の条件違反を明確に伝えられます。
パターン⑥finallyブロックについて

finallyは「エラーが起こっても起こらなくても、必ず実行される処理」を書く場所です。ファイルを閉じたり、データベースを終了したりする時によく使います。
public static void main(String[] args) {
try {
int result = 10 / 0; // エラーが起きる
} catch (ArithmeticException e) {
System.out.println(“エラーが起きました:0で割ることはできません!”);
} finally {
System.out.println(“この処理は必ず実行されます。”);
}
}
}
この処理は必ず実行されます。
finallyブロックはtryの中でエラーが起きても必ず実行される部分です。
たとえばファイルを開いたら必ず閉じる処理をfinallyに書いておけば、万が一エラーが起きても安心、といった具合です。
実行結果からも、エラーが発生してもfinallyが必ず動くことが確認できます。
Javaのtry-catchの注意点
この章では注意点として、以下の3つをご紹介します。
- 継承上位のものが先だとエラーになる
- 例外に何も処理を施さない
- tryブロックの範囲を広くしない
注意点①継承上位のものが先だとエラーになる

例外を処理する際、例外の順番を間違えるとエラーになります。
たとえば、Exceptionはほとんどの例外をカバーできる最上位のクラスです。そのため、NullPointerExceptionのような特定の例外の前に書いてしまうと、細かいエラーをキャッチする前にすべてExceptionで処理されてしまいます。
以下は、エラーが発生するプログラムです。
public static void main(String[] args) {
try {
int result = 10 / 0; // ここでエラーが起こる(ArithmeticException)
} catch (Exception e) { // 継承上位のExceptionクラスが最初に書かれている
System.out.println(“例外が発生しました:全般的なエラーです。”);
} catch (ArithmeticException e) { // この行がエラーになる
System.out.println(“エラーが発生しました:0で割ることはできません!”);
}
}
}
実行結果(エラーメッセージ):
} catch (ArithmeticException e) {
^
エラー1個
ExceptionがArithmeticExceptionよりも先に書かれているため、ArithmeticExceptionにたどり着く前にエラーになります。上記を正すと、以下のようになります。
public static void main(String[] args) {
try {
int result = 10 / 0; // ここでエラーが起こる(ArithmeticException)
} catch (ArithmeticException e) { // 具体的なエラーを先に書く
System.out.println(“エラーが発生しました:0で割ることはできません!”);
} catch (Exception e) { // 継承上位のエラーは後に書く
System.out.println(“例外が発生しました:全般的なエラーです。”);
}
}
}
注意点②例外に何も処理を施さない
エラーをキャッチしたcatchブロックの中身に対し、何も処理を施さないのは危険です。エラーが起きたことに誰も気づかずに、プログラムが動き続けてしまうからです。
とくににログ出力を無視すると対応が後手に回り、致命的な状況に陥る可能性があります。たとえ納期に追われているなどの状況でも、例外処理は必ず、丁寧に行うべきです。
注意点③tryブロックの範囲を広くしない
tryブロックの中に無関係なコードを入れすぎないことが大切です。なぜなら、大量の処理をtryブロックに入れると、どのコードでエラーが起きたか特定するのが難しくなるからです。
また、不要な処理までcatchの対象になると、予期しない動作につながることもあります。エラーが起きそうな箇所を絞り込み、その部分だけにtryに入れ正確にキャッチするようにしましょう。
Javaのtry-catchをより深く学ぶための学習手段
より深く学ぶための学習手段としては、以下が挙げられます。
- 実際に何かを開発してアウトプット
- スクール・セミナーを活用する
それぞれ見ていきましょう。
手段①実際に何かを開発してアウトプット
実際にプログラムを開発してエラーを乗り越えつつ実装する経験が重要です。
簡単なアプリやゲームを作りながら、例外が発生しやすい部分にtry-catchを組み込んで動作を確認しましょう。エラーを意図的に発生させたり、例外メッセージをログに記録したりすることで、確かな知識が身につきます。
どんなものを開発すればいいかわからない方は、以下の記事で紹介するプログラムも、ぜひ参考にしてほしいと思います。
手段②スクール・セミナーを活用する
独学での学習に限界を感じた場合は、スクールやセミナーを活用するのも有効です。知識ゼロの初心者に対しても、基礎をはじめ、try-catchの正しい使い方や実践的な活用方法を指導してくれます。
動画や課題を通じて何度も繰り返し実践できるので理解を深めやすく、また講師による質問対応がある場合もあるので初心者でも安心です。お金はかかりますが、勉強時間を短縮し、効率よく学べる手段として検討する価値はあります。
なお、JAVAの学習におすすめのスクール・セミナーを知りたい方は、ぜひ以下の記事も参考にしてください。
Javaのtry-catchに関するよくある質問
最後に、よくある質問を紹介・回答していきます。
Javaのtry-catchまとめ
今回はtry-catchの基本的な使い方から複雑な例外処理パターン、finallyブロックの活用法まで幅広く紹介しました。使いこなすことでプログラミングの効率と安全性を大きく向上させるカギといっても過言ではありません。
実践的なコード例を参照しながらそれぞれのシナリオで最適な書き方を理解し、適切に適用することができれば、エラーの対応だけでなくプログラムの信頼性と読みやすさも向上します。
try-catchを使いこなし、よりJavaを便利に活用しましょう。