Java例外処理とは?例外処理の書き方も紹介!

- システム
エンジニア - Javaのtry-catch文はどのようなときに使うのですか。
- プロジェクト
マネージャー - Javaのtry-catch文は例外処理のときに使用します。

例外処理とは?
プログラム実行中に発生するエラーに対処するために、Javaには例外処理という機能があります。この記事ではtry-catch文の使い方を中心に、例外処理の基本的な書き方を、コード例を示しながら説明していきます。
Javaのtry-catch構文
Javaのtry-catch文では、try節に実行したい処理を記述し、そこで発生する例外への対処方法をcatch節に記述します。書き方は次のようになります。
1
2
3
4
5
6
7
|
try {
// 処理したい内容
} catch (例外クラス 変数名) {
// 例外処理
}
|
複数種類の例外が起こる可能性がある場合の書き方は、例外クラス毎にcatch節で異なる処理の記述が可能です。
1
2
3
4
5
6
7
8
9
|
try {
// 処理したい内容
} catch (例外クラス1 変数名) {
// 例外処理
} catch (例外クラス2 変数名) {
// 例外処理
}
|
try節やcatch節の後に実行する、finally節を最後に記述できます。ここには、例外発生の有無にかかわらず実行したい終了処理を記述します。finally節の書き方は次のようになります。
1
2
3
4
5
6
7
8
9
|
try {
// 処理したい内容
} catch (例外クラス 変数名) {
// 例外処理
} finally {
// 最後に常に実行
}
|
try-catch文の流れをコード例で確認しよう
コマンドラインで指定した整数xを読み込み、”1000/x”の除算を実行するJavaプログラムを例に、例外処理を説明します。
例外が発生するコードの例
例外が発生する可能性のあるJavaプログラムの例です。例外処理は記述していません。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class Sample01 {
public static void main(String[] args) {
// コマンドライン引数を読み込み
String arg0 = args[0];
// 整数xに変換
int x = Integer.parseInt(arg0);
// 割り算を実行
int y = 1000 / x;
System.out.println("1000/x = " + y);
System.out.println("実行終了!");
}
}
|
正常実行の例として、xに20を指定した場合の出力を示します。
1
2
3
4
5
|
$ java Sample01 20
1000/x = 50
実行終了!
|
上のJavaプログラムで実行時に発生するエラーには、引数が読み込めない、読み込んだ値が整数でない、xが0でゼロ除算になるという可能性があります。
例えば、引数0を指定した場合には、次の実行時にエラーメッセージが出力され、プログラムは途中で中断されます。
1
2
3
4
5
|
$ java Sample01 0
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Sample01.main(Sample01.java:10)
|
try-catchを使ったコード例
Sample01にtry-catch構文を適用したJavaコードの書き方の例を、Sample02に示します。3種類の例外に対応するcatch節を記述しました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public class Sample02 {
public static void main(String[] args) {
try {
// コマンドライン引数を読み込み
System.out.println("コマンドライン引数を読み込み");
String arg0 = args[0];
// 整数xに変換
System.out.println("整数xに変換");
int x = Integer.parseInt(arg0);
// 割り算を実行
System.out.println("割り算を実行");
int y = 1000 / x;
System.out.println("1000/x = " + y);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("ArrayIndexOutOfBoundsExceptionが発生");
} catch (NumberFormatException e) {
System.out.println("NumberFormatExceptionが発生");
} catch (ArithmeticException e) {
System.out.println("ArithmeticExceptionが発生");
} finally {
System.out.println("finally節を実行");
}
System.out.println("実行終了!");
}
}
|
引数0を指定した場合の実行結果は、次のようになります。コードの流れを確認してみて下さい。
1
2
3
4
5
6
7
8
9
|
$ java Sample02 0
コマンドライン引数を読み込み
整数xに変換
割り算を実行
ArithmeticExceptionが発生
finally節を実行
実行終了!
|
検査例外では例外処理の記述が必須
Javaの例外クラスには、検査例外と非検査例外があります。検査例外では、例外処理の記述をコンパイラがチェックするため、必ず例外処理を書く必要があります。
Sample01の例では、例外処理を記述していませんでしたが、このコードで発生する例外は非検査例外なので、コンパイルは正常終了します。
検査例外の例として、文字ファイルを読み込むためにFileReaderを生成するJavaプログラムを示します。
1
2
3
4
5
6
7
8
9
10
|
import java.io.*;
class Sample04 {
// コンパイルエラー発生
public static void main(String args[]) {
FileReader reader = new FileReader("test.txt");
// この後にreaderを使った処理...
}
}
|
このコードをコンパイルすると、FileNotFoundExceptionを捕捉する必要があるというエラーがでます。そこでtry-catchを入れる書き方で、次のように修正します。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import java.io.*;
class Sample05 {
public static void main(String args[]) {
try {
FileReader reader = new FileReader("test.txt");
// この後にreaderを使った処理...
} catch (FileNotFoundException e) {
System.out.println(e);
}
}
}
|
メソッドを跨ぐ例外処理の書き方
例外が発生したときにメソッド内ではなく、それを呼び出した親メソッド内で処理する方が都合の良い場合もあります。そこで、メソッドを跨ぐ例外処理の書き方を説明します。
上記のSample05で、FileReaderを取得する処理をメソッドに抜き出すとします。myFileReaderというメソッドに置き換えたJavaコードの書き方の例を、Sample06に示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import java.io.*;
class Sample06 {
public static void main(String args[]) {
try {
FileReader reader = myFileReader();
// この後にreaderを使った処理...
} catch (FileNotFoundException e) {
System.out.println("FileNotFoundExceptionが発生");
}
}
private static FileReader myFileReader() throws FileNotFoundException {
FileReader reader = new FileReader("test.txt");
return reader;
}
}
|
ここで、myFileReaderメソッド内にはtry-catch文がありません。コンパイルエラーを避けるため、「例外は親メソッドに投げます」ということを宣言しているのが、「throws 例外クラス」の記述です。
test.txtというファイルがない状態で実行されると、出力は下記のようになり、main内のcatch節を実行していることがわかります。
1
2
3
4
|
$ java Sample06
FileNotFoundExceptionが発生
|
- システム
エンジニア - Javaの例外クラスには検査例外と非検査例外があるのですね。
- プロジェクト
マネージャー - その通りです。検査例外では例外処理の記述をコンパイラがチェックするため、必ず例外処理を書くようにしましょう。
例外処理の基本を理解しましょう
Javaの例外処理の基本として、try-catch文の使い方を中心にコードの書き方を説明しました。try節の実行中に例外が発生すると、catch節を実行し、例外の処理をします。例外が発生したときにどんな処理が必要かを考えながら、書き方を工夫してみて下さい。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
-
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅) -
販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅) -
生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅) -
社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅) -
金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅) -
大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)