【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文を使って例外処理をする方法について解説しました。

例外処理が行われていないと、実行時エラーが発生したときにそこでプログラムが終了してしまうので注意してくださいね。

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

Javaカリキュラム無料公開中!

この記事はJava入門完全攻略ガイド【基礎学習/アプリ開発/仕事獲得】の一部になります。このカリキュラムは、プログラミング入門者が、基礎学習からアプリ開発、さらには仕事獲得まで体系的に学べる内容となっています。

Java学習に必要な情報を一つにまとめていますので効率よくJavaを学ぶことが出来ます。この機会に是非活用していただければと思います。

Java入門からアプリ開発まで未経験者が知っておくべき基礎を総ざらい
更新日 : 2018年12月13日

最短でJavaを習得したい方へ

もし、あなたが、

「難しすぎて学習が全然進まない」
「学習量が膨大でゴールが見えない」
「エラーを解決するのに何日もかかってしまう」

など、プログラミング学習やキャリアに関してお困りであれば、まずは『無料体験レッスン』にお申し込み下さい。

あなたにとって、最適の解決策をご提案させていただきます。

詳しくは下の画像から詳しいサービス内容をご確認ください。

cta_bannar-java2

非常識な結果を出す卒業生多数!

エンジニアキャリア戦略

人気記事セレクション

3000名以上来場の人気セミナーが開催決定

18歳で時給6000円だった侍エンジニア塾代表の木内より、『プログラミングで人生を変える』ための学習方法をお教えます。

0からプログラミングを習得し、フリーランスエンジニアになる方法プログラミング学習の効率を劇的に上げる学習メソッドを解説しますので、奮ってご参加ください。

  • 日付:4/20(土),4/27(土)
  • 時間:14:00〜17:35終了予定
  • 場所:当社 道玄坂オフィス
  • 住所:〒150-0043 東京都渋谷区道玄坂2丁目11-1 Gスクエア渋谷道玄坂 4F *Googleマップでは「東京都渋谷区道玄坂2丁目11-1」で検索してください。近隣にスクエア渋谷という別のビルがあるためご留意ください。
  • 参加費:無料
  • URL:https://seminar.sejuku.net/
詳しくは下の画像をクリックして弊社セミナー内容をご確認ください。

LINEで送る
Pocket

この記事が気に入ったら
いいね!をしてフォローしよう

最新情報をお届けします

書いた人

中沢 丈

中沢 丈

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

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