JavaでExceptionを使って例外処理を行う方法【初心者向け】

初心者向けにJavaでExceptionを使って例外処理を行う方法について解説しています。例外処理の種類をいくつか紹介し、実際にプログラムを書いて説明しています。自分でもソースコードを書いてみて実行結果を確認してみましょう。

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。

監修してくれたメンター

nakamoto

アジマッチ有限会社 代表取締役
対応業務:PHP(Laravel)、機械学習、Vue.js、LAMP・AWS、越境EC、スマホアプリ、Unity、Rails、スマートコントラクト、講師、執筆、CTO

初心者向けにJavaにおけるExceptionについて、テックアカデミーのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。

今回は、JavaのExceptionを使った例外処理を解説します。

実務でも、Exceptionを利用した例外処理を実装することがありますので、しっかり学習してください。

目次

そもそもJavaについてよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まります。

 

田島悠介

今回はExceptionを使った例外処理について解説しよう。

大石ゆかり

田島メンター!例外処理というのは何ですか~?

田島悠介

想定外の動作が起こったときの対応を、あらかじめ指定しておくことを言うんだ。まずその予期しない状況、「例外」の具体的な場面について見ていってみようか。

大石ゆかり

分かりました!

エラーとは

エラーはプログラム動作時に完了できなかった、上手く終了できなかった状態を指します。

プログラムの記述間違いだけでなく、ハードウェアが原因となることもあります。

また、Javaの例外処理については以下のような状態も含みます。

 

コンパイルエラー

Javaでプログラミングをする上で最もよく出会うエラーはコンパイルエラー(文法エラー)です。

タイプミスやメソッドの引数の型が異なる、変数に代入する型が違っているケースが多く、コンパイルエラーの場合は、そもそも実行できません。

 

実行時エラー

実行できるプログラムであるものの、何らかの理由でプログラムが異常終了してしまう場合に実行時エラーとなります。

ランタイムエラーと呼ばれることもあり、プログラムが停止したうえでクラッシュなどの原因となることもあります。

 

論理エラー

論理エラーは、実行は問題なく可能であるものの、期待した結果になっていない状態です。

一言でエラー、と言っても様々なものがあるため、混同に注意しましょう。

 

Exceptionとは

Exceptionは日本語で例外という意味です。

プログラムはあらかじめどういった処理をするのか、という手順を書いたものです。

しかし、状況によっては予期しない事象で正しく処理が行えないことも少なくありません。

そのような予期しない状況をJavaでは例外(Exception)と呼んでいます。

想定外の事象をなるべく減らすためには、例外が起こった場合に備えて何かしら対応を考えておく、ということが重要です。

そして、例外発生時に対応する処理のことを例外処理(エラーハンドリング)といいます。

 

例外の種類

Javaで発生する例外は、主に以下の種類があります。

  • Error
  • RuntimeException
  • Exception

それぞれの例外エラーについて解説します。

 

Error

システム上重大で回復不能な事象を引き起こすものです。

そもそも回復不能な重大な状況なので、プログラム側ではほとんど対応のしようがありません。

(例:メモリ不足、スタックオーバーフロー、その他JRE自体に問題があり、JRE自体が停止する事象)

 

RuntimeException

実行時に起こった例外で必ずしも対処しなくても良い事象のことです。

例外処理を書くか書かないかは状況によります。

プログラムのバグの可能性も多く、プログラムを修正することで正しく動作する場合もあるでしょう。

例えば、以下のような場合が該当します。

  • Stringの数字をintの整数に変換しようとしたがそもそも数字ではなかった(NumberFormatException)
  • インスタンスがある前提でプログラムは書かれているのに存在しなかった(NullPointerException)

 

Exception

例外を記述する方法です。

例外の処理を行う必要があり、別名・検査例外とも呼ばれます。

Exceptionの代表的な例としては、ファイルを開こうとしたが対象のファイルが存在しなかった(FileNotFoundException)などです。

対象のファイルを開いた時にファイルが存在すれば、正常に処理が進められます。

しかし、なければ処理が進められず、例外が発生したことになります。

また、Exceptionは例外処理を書かなければ、コンパイルが通らないため、例外処理の記述を強制が必要です。

 

[PR] Javaプログラミングで挫折しない学習方法を動画で公開中

例外処理を行う方法

例外処理は以下の2つの方法があります。

  1. 自分で例外を処理する
  2. 自分では処理せず、例外処理を呼び出し元のクラスにthrows する

 

自分で例外を処理する

自分で例外を処理する場合はtry – catch – finally構文を使用し、finallyブロックは必要に応じて記述しましょう。

例外が発生する可能性のあるメソッドをtryブロックで囲み、catchブロックで処理したい例外を捉えます。

finallyブロックは例外が発生してもしなくても共通で行う処理を記述します。

 

自分では処理せず、例外処理を呼び出し元のクラスにthrows する

例外処理を呼び出し元のクラスに丸投げするには、メソッドのシグニチャにthrows 例外クラス名と記述しましょう。

 

田島悠介

例外処理の2つの方法について把握できたかい?

大石ゆかり

はい、try-catchを使う場合とthrowを使う場合ですね。

田島悠介

次にそれぞれの実際の例を見てみよう。

 

実際に書いてみよう

自分で例外を処理する場合

今回は、test.txtというファイルを読み込もうとしている処理です。

FileReaderクラスのオブジェクトを生成する時に対象となるファイルが存在しない場合は、FileNotFoundExceptionという例外が発生します。

 

自分で例外を処理する場合のサンプルコード

  FileReader reader = null;
  File file = new File("test.txt");
  try {
    reader = new FileReader(file);
    //何かしらファイルの処理が続く
    // ...
  } catch (FileNotFoundException fnfe) {
    // ファイルが見つからなかったときの例外処理
    System.out.println(fnfe);
  } catch (IOException ioe) {
    //それ以外の入出力例外処理
    System.out.println(ioe);
  } finally {
    try {
      if(reader != null) {
        reader.close();
      }
    } catch (IOException ioe) {
      // closeに失敗したときの例外処理
      System.out.println(ioe);
      throw ioe;
    }
  }
  System.out.println("ファイル処理完了");

自分で例外を処理する場合の解説

FileNotFoundException

FileNotFoundExceptionという例外が発生する場合は、catchブロックが該当する例外を捕まえ、そのブロック内の処理を行います。

 

finally

次にfinallyブロックに移り、ファイルのクローズ処理を行います。

finallyブロックは例外が起きなかった場合でも必ず実行されるブロックです。

また、closeで失敗した場合、IOExceptionという例外が発生します。

ただ、ファイルクローズ時の失敗というのは結構深刻な状況ですので例外処理としてできることはほとんどないに等しいかと思います。

finallyブロックを抜けると通常通り、以降の処理を続行します。

close周りの処理が非常に複雑です。

実はJava7から try-with-resources構文と言って、自動でクローズしてくれる仕組みがあります。

try-with-resources構文を使うと少し楽に書くことができます。

  File file = new File("test.txt");
  try(FileReader reader = new FileReader(file)) {
    //何かしらファイルの処理が続く
    // ...
  } catch (FileNotFoundException e) {
    // ファイルが見つからなかったときの例外処理
    System.out.println(e);
  } catch (IOException ioe) {
    //それ以外の入出力例外処理
    System.out.println(ioe);
  }
  System.out.println("ファイル処理完了");

自分で例外を処理する場合の表示結果

java.io.FileNotFoundException: test.txt (No such file or directory)
ファイル処理完了

注目すべき点は、ファイル処理完了と例外が発生しても処理を続行できているところです。

このように例外処理を行った後は、通常の処理に戻すことができます。

 

例外を呼び出し元へthrows する場合

例外を呼び出し元へthrows する場合のサンプルコード

public void read() throws FileNotFoundException, IOException {
  File file = new File("test.txt");
  FileReader reader = new FileReader(file);
  //何かしらファイルの処理が続く
  // ...
  reader.close();
  System.out.println("ファイル処理完了");
}

例外を呼び出し元へthrows する場合の解説

ファイルを読み込むメソッドの名前がreadメソッドだとします。

呼び出し元へthrows する場合は、メソッドのシグニチャにthrows句を記述します。

発生する例外は、以下の結果になります。

FielNotFoundException
IOException

そのため、メソッドシグニチャに以下を追記します。

throws FileNotFoundException, IOException

なお、FileNotFoundExceptionはIOExceptionの子クラスなのでthrows IOExceptionのみでも動作自体は問題ないです。

例外を呼び出し元へthrows する場合の表示結果

java.io.FileNotFoundException: test.txt (No such file or directory)
ファイル処理完了

 

まとめ

以上、Exceptionを使って例外処理を行う方法などについて解説しました。

  • エラーとは
  • Exceptionとは
  • 例外処理を行う方法

どういった場合に扱う処理なのか知っておくといざという時役立つでしょう。

入門向けJavaの学習サイトもまとめているので、あわせてご覧ください。

 

田島悠介

try-catchによる処理とthrowによる処理、両方の書き方を解説したよ。

大石ゆかり

コンパイル時ではなく、プログラムの実行中に起こった問題への対応に使うのが例外処理というわけですね。

田島悠介

どのような場面で例外処理が必要になるのか、例外そのものの性質についてもよく調べておこう。

大石ゆかり

了解です。ありがとうございました!

 

Javaを学習中の方へ

これで解説は終了です、お疲れさまでした。

  • つまずかず「効率的に」学びたい
  • 副業や転職後の「現場で使える」知識やスキルを身につけたい

プログラミングを学習していて、このように思ったことはありませんか?

テックアカデミーのJavaコースでは、第一線で活躍する「プロのエンジニア」が教えているので、効率的に実践的なスキルを完全オンラインでしっかり習得できます。

合格率10%の選考を通過した、選ばれたエンジニアの手厚いサポートを受けながら、JavaやServletの技術を使ったWebアプリケーション開発を学べます。

まずは一度、無料体験で学習の悩みや今後のキャリアについて話してみて、「現役エンジニアから教わること」を実感してみてください。

時間がない方、深く知ってから体験してみたい方は、今スグ見られる説明動画から先に視聴することをおすすめします!