【Java】try-catchで例外処理を実装しよう!Exceptionクラスの使い方

Javaで例外処理を実装するには、try-catch処理の中でExceptionクラスを指定する必要があります。そもそも例外処理とは、

実行停止してはいけないプログラムに何らかのエラーが発生して落ちた
途中で問題が発生した場合、その後の処理を自分でコントロールしたい

のような状態を指します。この例外処理を使うことで、エラーが発生して落ちてしまう場合や問題が発生した場合の処理を自分でコントロールできるようになります。

この記事では、

  • try-catch文とは
  • try-catch文の使い方
  • finallyで必ず実行する処理を記述する方法

という基本的な内容から、

  • throwで意図的に例外を発生させる方法
  • throwsで呼び出し元で例外処理をする方法
  • 例外メッセージをカスタマイズする
  • Exceptionクラスの種類一覧
  • 独自の例外クラスの作成

などの応用的な使い方に関しても解説していきます。今回はこれらの方法を覚えるために、try-catch文のさまざまな使い方をわかりやすく解説します!

try-catch文とは

try-catch文とは、例外が発生する可能性がある処理に使うものです。try-catch文を使うことで、例外が発生しない場合の処理と、例外が発生したときの処理を分けることができます

さらに、finallyを使って例外の有無に関わらず、最後に必ず実行される処理を記述することができます。try-catch文は次のように記述します。

try-catch文の詳しい使い方はこの記事で順に解説していくので、ぜひ最後まで確認してください!

try-catch文の使い方

ここではtry-catch文の使い方を解説します。try-catch文の使い方は、tryブロックの中に例外が発生する可能性のある処理を記述し、catchブロックの中に例外が発生した後の処理を記述します。

try-catch文の使い方を次のプログラムで確認してみましょう。

実行結果:

このプログラムでは、divメソッドで割り算を行い、その結果を呼び出し元のmainメソッドに返しています。0で割り算を行っているので、ArithmeticExceptionの例外をスローして、catchブロックの中の処理が行われていることがプログラムの実行結果から確認できます。

finallyで必ず実行する処理を記述する方法

ここではfinallyの使い方を解説します。finallyブロックの中の処理は、例外の有無に関わらず、最後に必ず実行されます。そのため、finallyはファイルを開いた後に確実にcloseメソッドで閉じたいときなどに使用されます。

次のテキストファイルを読み込み表示するプログラムで、finallyの使い方を確認してみましょう。

実行結果:

このプログラムのように、finallyブロックの中でcloseメソッドを使うことで確実にファイルを閉じることができます。try-catch-finallyの使い方についてはこちらで詳しく解説しているので、ぜひ確認してください!

【Java入門】try-catch-finallyの使い方
更新日 : 2019年1月28日

throwで意図的に例外を発生させる方法

ここではthrowの使い方を解説します。throwは意図的に例外をスローして、例外処理を行いたい場合に使います。次のプログラムで確認してみましょう。

実行結果:

このプログラムではthrowを使って、0で除算をする場合にArithmeticExceptionの例外をスローしています。

throwsで呼び出し元で例外処理をする方法

throwsの使い方を解説します。throwsは例外が発生したときにtry-catch文を使ってメソッド内で処理するのではなく、メソッドの呼び出し元で例外処理をしたい場合に使います。次のプログラムで確認してみましょう。

実行結果:

このプログラムではthrowsを使って、呼び出し元のmainメソッドで例外処理を行っています。throwとthrowsの使い方についてはこちらで詳しく解説しているので、ぜひ確認してください!

【納得Java】try-catch文のthrowとthrowsの使い分け
更新日 : 2019年4月2日

例外メッセージをカスタマイズする

例外が発生した場合に出力表示するメッセージについて、いくつかご紹介します。

これまでのサンプルコードでも、

  • System.out.println(e)
  • e.printStackTrace()

などを使って例外メッセージを出力表示しています。printStackTraceメソッドはよく使用されていますが、例外によってはメッセージが長すぎると感じる場合もあります。

例外メッセージは出来ればコンパクトなログとして残したいので、ここではgetMessageメソッドなどを使う方法などをご紹介します。

printStackTraceメソッドの使い方

以下のサンプルコードを使って例外を発生させ、printStackTraceメソッドで例外メッセージを出力表示させてみましょう。

実行結果:

このサンプルコードでは、Fileクラスのコンストラクタで指定したファイルが見つからないため、例外FileNotFoundExceptionが発生しています。例外処理として、catchブロックでprintStackTraceメソッドを使ってメッセージを出力表示するようにしています。

getMessageメソッドの使い方

さきほどは、printStackTraceメソッドを使って例外メッセージを出力表示しました。でも、メッセージが少々長すぎるので、もう少しコンパクトになるとうれしいですよね。getMessageメソッドを使用すると、メッセージを短くすることができるのでご紹介します。

実行結果:

このサンプルコードでは、getMessageメソッドを使って例外メッセージを出力表示しています。printStackTraceメソッドを使って出力表示されるメッセージの一行目「:」以降をメッセージとして表示します。

getClass、getStackTraceを使う方法

getMessageメソッドを使う方法をご紹介しましたが、これだけでは情報として少ないと感じませんか?せめて、例外の種類、例外発生場所の情報はあった方がいいかもしれません。

例外の種類の情報を記述するためには、getClassメソッドを使います。例外発生場所の情報を記述するためには、getStackTraceメソッドを使います。サンプルコードで確認しましょう。

実行結果:

このサンプルコードでは、getClass().getName()メソッドとgetMessageメソッド、およびgetStackTraceメソッドを使って例外メッセージを出力表示しています。

getStackTraceメソッドはprintStackTraceメソッドを使って出力表示される「at」以降の例外発生場所の記述を配列で返します。getStackTraceメソッドで返された配列をStackTraceElement型の配列steに格納しています。

配列steの要素の中で、記述したコードの例外発生場所は最後の要素に記述されているので、最後の要素のみ出力表示しています。また、getClass().getName()メソッドを使って、該当する例外クラス名を出力表示しています。

Exceptionクラスの種類一覧

よくみかけるExceptionクラスについて表にまとめました。

例外クラス説明
java.lang.IllegalArgumentException不適切な引数引数の指定エラー
java.lang.IllegalStateException不正な状態未初期化で呼び出し
java.lang.NullPointerExceptionNullアクセス文字列の値がNull
java.lang.IndexOutOfBoundsException範囲外配列のインデックス番号がオーバー
java.lang.ArithmeticException不正な算術計算ゼロでの割り算
java.lang.NumberFormatException不正な数値型への変換変換元の文字列が数値でない
java.io.FileNotFoundExceptionファイルが開けないファイルが存在しない
java.io.IOException不正な入出力ファイルが存在しないなど

この表以外の例外クラスについては、こちらの公式サイトを参考にしてくださいね。
http://docs.oracle.com/javame/config/cdc/ref-impl/cdc1.1.2/jsr218/ja/java/lang/class-use/Exception.html

独自の例外クラスの作成

例外クラスを継承して、独自の例外クラスを作ることができます。親クラスとなる例外クラスのコンストラクタを継承して使用します。親クラスとなる例外クラスのメソッドを使用することも可能です。Exceptionクラスを継承した独自の例外クラスを使用する例をみてみましょう。

実行結果:

このサンプルコードでは、Exceptionクラスを継承して独自の例外クラスMyExcクラスを作成しています。

Exceptionクラスでは、String型の引数を指定するコンストラクタとThrowable型の引数を指定するコンストラクタとString型、Throwable型両方の引数を指定するコンストラクタが定義されています。

MyExcクラスでもこれらのコンストラクタを「super」句を使って継承しています。Mainクラスを実行すると、String型文字列”0で割ったときの例外を発生させる”で例外を投げ、catchブロックで一旦例外を受け取ります。

さらに、一旦受け取った例外をString文字列”独自クラスの例外発生”とThrowable型変数eで例外として投げ、catchブロックで受け取っています。

まとめ

いかがでしたか? 今回はtry-catch文を使って例外処理をする方法について解説しました。例外処理が行われていないと、実行時エラーが発生したときにそこでプログラムが終了してしまうので注意してくださいね。

もし、例外処理の方法を忘れてしまったらこの記事を確認してください!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

中沢 丈

中沢 丈

フリーランスエンジニア。
システム開発からコンテンツ作成まで幅広く対応します。

連絡先はこちらです。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説