注目記事

【Javaコード入門】例外処理_②try…catch命令

例外を処理する – try…catch命令

try {
tstatements
} catch(exclazz ex) {
cstatements
}
 tstatements:例外が発生する可能性がある処理
 exclazz:例外クラス
 ex:例外クラスを表す変数名
 cstatements:例外が発生した時に実行される処理

コードの中で発生するかもしれない例外をあらかじめ把握し、発生時になんらかの処理(たとえばログへの記録など)を行うことを例外処理と言います。例外処理には、try…catch…finally命令を利用します。 たとえば以下は、ファイル処理で指定のファイルが存在しなかった場合に、その旨をメッセージ出力する例です。

ExTry.java

  1. package com.example.mynavi.exception;
  2.  
  3. import java.io.FileNotFoundException;
  4. import java.io.FileReader;
  5.  
  6. public class ExTry {
  7.  
  8.  public static void main(String[] args) {
  9.   try {
  10.    var reader = new FileReader("C:/data.txt");
  11.   } catch (FileNotFoundException e) {
  12.    e.printStackTrace();
  13.   }
  14.  }
  15. }

FileReaderクラス(java.ioパッケージ)は指定のファイルが存在しない場合に、FileNotFound例外を発生します。例外処理を行うには、まず例外を発生する可能性があるコードをtryブロックで囲みます。tryブロックの中で例外が発生した場合、処理はcatchブロックに引き継がれます(これを例外をキャッチすると言います)。

catchブロックでは「catch (例外の型 引数) { … }」の形式で受け取る例外を指定できます。複数の例外が発生する場合には、catchブロックを列記しても構いません。

catchブロックには引数を経由して例外オブジェクトが渡されますので、そのメソッドなどを利用して、具体的な例外処理を行います。ここでは例外スタックトレースを標準出力に出力しています。スタックトレースとは、例外が起こるまでのメソッドの呼び出し過程を記録した情報のことです。

例外オブジェクトの主な取得メソッド
メソッド 取得できる情報
getCause() 例外の原因
getMessage() 例外メッセージ
getStackTrace() スタックトレース
printStackTrace() スタックトレース(標準出力に出力)

 

catchブロックは上から順に検索し、「発生した例外がcatchブロックの例外型と一致した、または、発生した例外のスーパークラスである」場合に実行されます。よって、複数のcatchブロックを連ねる場合には、より下位の例外クラスを最初に、上位の例外クラスを後に記述すべきです。
例えば、すべての例外クラスのスーパークラスであるExceptionクラスを最初に書いてしまった場合、すべての例外がそこで捕捉されてしまうので、以降のcatchブロックが呼び出されることはありません。
そもそもExceptionクラスは一般的な例外を表すことから、例外処理の意味も分かりにくくなりますので、最大限利用すべきではありません。

複数の例外をまとめてキャッチする

Java 7以降では、マルチキャッチという機能を利用することで、複数の例外をまとめてキャッチできるようになりました。例外の型に関わらず、同じ処理を施している場合には、マルチキャッチ機能を利用することで、よりコードを簡単に記述できます。
たとえば以下はHogeException/FooException/BarExceptionをまとめてキャッチする例です。

  1. try {
  2.  ...任意の処理...
  3. } catch (HogeException |
  4.     FooBarException |
  5.     PicoException e) {
  6.  e.printStackTrace();
  7. }
例外処理_目次
例外処理
try…catch命令
finally句
throw命令

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。