Javaでは例外処理を記述する際、Exceptionクラスを利用してエラー時の対処方法を定義します。
本記事では、Java初心者向けにExceptionクラスの基本的な使い方についてご紹介していきます。
Javaにおけるエラーと例外の違い
エラーと例外は同じような意味合いとして利用されることもありますが、Javaのプログラミングでは異なる状況を意味することも少なくありません。
まずはエラーと例外処理の一般的な違いについて解説していきます。
エラーとは
エラーとはプログラムが正常に動作せず、異常終了する状態やそもそも動作しない状態のことを指します。
エラーは大きく分けて「コンパイルエラー」と「実行時エラー」に分けることが可能です。
コンパイルエラー
コンパイルエラーは文法エラーが発生しており、そもそも実行出来る状態にないソースコードのエラーを指します。
Javaで記述されたプログラムは機械語に変換する作業(コンパイル)が必要となりますが、コード変換に失敗することで発生するエラーです。
実行時エラー
実行時エラーはプログラムの実行自体は可能ですが、何らかの問題により異常終了となってしまうエラーを指します。
コンパイルが出来たからといって期待通りの動作が実行される保証はありません。
実行時エラーではプログラムが強制終了されることもあれば、そのまま意図しない動作が継続される可能性もあるため注意が必要です。
例外処理とは
例外処理とは、実行時エラーが発生した際、システムの停止やデータを破損させないように対処する処理のことを指します。
システム障害が起こってしまった場合、どのような影響が出るのか予測が出来ないため、エラーが起きた際の対処法をあらかじめ例外処理として定義しておくことにより、開発者側でエラーをコントロールすることが可能となります。
Javaでの例外処理の書き方
Javaで例外処理を記述する場合「try文」を利用します。
基本構文
try文は「try~catch~finally」の大きく3つのブロックで記述します。
try { 例外が発生する可能性のある処理を記述; } catch (例外クラス 変数名) { 例外が発生した場合の処理を記述; } finally { 例外が発生してもしなくても必ず行うべき処理を記述; }
finally{}ブロックに関しては、必要なければ記述しなくても問題ありません。
try{}とcatch{}ブロックは例外処理ではセットで記述するものと覚えておきましょう。
catch句は複数記述可能
例外処理を記述するcatch句は1つのtry文で複数記述することが可能です。
例外クラスが引数として指定出来るため、エラー内容によって例外処理を切り替えることが出来ます。
try { 例外が発生する可能性のある処理を記述; } catch (例外クラス1 変数名1) { 例外クラス1に該当するエラーが発生した場合の処理を記述; } catch (例外クラス2 変数名2) { 例外クラス2に該当するエラーが発生した場合の処理を記述; }
例外クラスには、「IOException」「NullPointerException」など様々なクラスが用意されています。
メソッドから呼び出し元へ例外を返却
メソッドを利用する場合、呼び出し元へ例外を返却する方法として「throws」を利用します。
メソッド名 throws 例外クラス { 例外が発生する可能性のある処理を記述; }
呼び出し元へ例外を返却する場合、呼び出し元でtry~catchの処理を記述する必要があります。
try { メソッド名(); } catch (例外クラス 変数名) { 例外が発生した場合の処理を記述; }
Java例外処理のパターン
では実際にJavaの例外処理をいくつかのパターンで確認してみましょう。
IOException
まずはファイルを読み込もうとした際、指定したファイルが存在しなかった場合のエラーを確認してみましょう。
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; public class Main { public static void main(String[] args) { try { List file = Files.readAllLines(Paths.get("sample.txt")); } catch(IOException ex) { System.out.println("IOExceptionが発生しました。"); System.out.println(ex); } } }
実行結果が下記です。
IOExceptionが発生しました。 java.nio.file.NoSuchFileException: sample.txt
サンプルでは、IOExceptionクラスでエラーをキャッチしています。
Exception
汎用的に例外をキャッチしたい場合には「Exception」クラスを利用することが可能です。
Exceptionクラスを利用することで、Exceptionクラスを継承した例外を汎用的にキャッチすることが出来ます。
import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; public class Main { public static void main(String[] args) { try { List file = Files.readAllLines(Paths.get("sample.txt")); } catch(Exception ex) { System.out.println("Exceptionが発生しました。"); System.out.println(ex); } } }
実行結果が下記です。
Exceptionが発生しました。 java.nio.file.NoSuchFileException: sample.txt
上記のIOExceptionクラスを汎用的なExceptionクラスに変更した場合でも、例外処理を実施出来ていることが確認出来ます。
例外クラス毎に処理を細かく分けることは出来ませんが、最低限の例外処理を記述する場合には上記サンプルのようにExceptionクラスを指定することで対応することが可能です。
オリジナルの例外クラス
Java標準で用意されているクラス以外にも自分で例外クラスを作成することも可能です。
オリジナルの例外クラスを作成する場合、既存の例外クラスを継承して作成します。
public class Main { public static void main(String[] args) { try { throw new OriginalException("オリジナルの例外クラスです。"); } catch(OriginalException ex) { System.out.println(ex); } } } class OriginalException extends Exception { OriginalException(String msg) { super(msg); } }
実行結果が下記です。
sample.OriginalException: オリジナルの例外クラスです。
今回はサンプルとして「OriginalException」の例外クラスを作成し、mainメソッドで「throw」により強制的に例外クラスを呼び出しています。
出力結果を確認してみると、オリジナルの例外クラスが適用されていることをご確認頂けます。
さいごに: Javaプログラムでのエラー(例外)処理の重要性を把握しよう
本記事では、Javaプログラムにおける例外処理の基本についてご紹介してきました
実行時エラーが発生した際、システム障害を発生させないためにも例外処理を記述しておくのは基本です。
まずは今回ご紹介した基本となる知識や使い方を参考に、作成したプログラムにどのような例外処理を記述するのが適切なのかを学習していきましょう。
エラーと例外の使い方は利用する人や状況によっても異なるため、あくまで今回の内容を目安とした上で文脈などから判断しましょう。