Webサイト制作コースのお申し込みはこちら

try-catch文とは?

try-catch文とは、Javaでtryとcatchという2つブロックを使用して記述された例外処理の文です。

通常、実行される場合の処理をtryブロックに、例外発生時に実行される場合の処理をcatchブロックに分けて記述します。

try{
  (通常実行される文)
}catch(例外クラス 変数名){
  (例外発生時に実行される文)
}

try-catch文の使い方・書き方

例外処理に使うのは何となくわかりました。具体的な書き方も知りたいです。

では、ここからはtry-catch文の具体的な使い方・書き方を見ていきましょう。

まずは、基本的なtry-catch文の使い方・書き方をご紹介します。

import java.io.*;
public class Main{
  public static void main(String[] args){
    try{
      FileReader fr = new FileReader("sample.txt");
      System.out.println("sample.txtを読み込みました。");
    }catch(Exception e){
      System.out.println("例外が発生しました。");
      System.out.println(e);
    }
  }
}

上記のサンプルコードは、sample.txtというファイルを読み込むためのプログラムです。

tryブロックの中で、「sample.txtというファイルの読み込み」と、「読み込みが成功したことを示す文字列を表示」させます。

catchブロックの中では、「sample.txtというファイルの読み込みができなかったことを示す文字列の表示」と、「Exceptionの例外をスロー」します。

sample.txtファイルを読み込めなかった場合の実行結果は、以下のようになります。

例外が発生しました。
java.io.FileNotFoundException: sample.txt (No such file or directory)

try-catch文で複数の例外をcatchする方法

try-catch文で複数の例外処理を記述したいときは、catchブロックを複数個つくればOKです。

以下のプログラムでは、2個のcatchブロックをつくっています。

import java.io.*;
public class Main{
  public static void main(String[] args){
    try{
      FileReader fr = new FileReader("sample.txt");
      System.out.println("sample.txtを読み込みました。");
      Class c = Class.forName("sampleClass");
      System.out.println("クラスを読み込みました");
    }catch(FileNotFoundException e){
      System.out.println("ファイル読み込みの例外が発生しました。");
      System.out.println(e);
    }catch(ClassNotFoundException e){
      System.out.println("クラス読み込みの例外が発生しました。");
      System.out.println(e);
    }
  }
}

ファイルとクラスの例外を分けるために、「Exception」を「FileNotFoundException」と「ClassNotFoundException」に分割しました。

Exception系のエラーについては、さまざまな種類があるので以下のサイトを参考にしてみるといいでしょう。

https://docs.oracle.com/javame/config/cdc/ref-impl/cdc1.1.2/jsr218/ja/java/lang/class-use/Exception.html

sample.txtファイルは読み込めたけど、クラスの読み込みができなかった場合の実行結果は、以下のようになります。

sample.txtを読み込みました。
クラス読み込みの例外が発生しました。
java.lang.ClassNotFoundException: sampleClass

try-catch文で必ず実行する処理は、finallyで対応する

例外が発生してもしなくても、強制終了になるときでも、必ず実行しなければいけない処理を実行にするには、finallyブロックを使います。

finallyブロックは、以下のようにcatchブロックの下に記述します。

try{
  (通常実行される文)
}catch(例外クラス 変数名){
  (例外発生時に実行される文)
}finally{
  (例外があってもなくても必ず実行する文)
}

先ほどのファイルとクラスの読み込みプログラムに、finallyブロックを追加したプログラムが以下になります。

import java.io.*;
public class Main{
  public static void main(String[] args){
    try{
      FileReader fr = new FileReader("sample.txt");
      System.out.println("sample.txtを読み込みました。");
      Class c = Class.forName("sampleClass");
      System.out.println("クラスを読み込みました");
    }catch(FileNotFoundException e){
      System.out.println("ファイル読み込みの例外が発生しました。");
      System.out.println(e);
    }catch(ClassNotFoundException e){
      System.out.println("クラス読み込みの例外が発生しました。");
      System.out.println(e);
    }finally{
      System.out.println("---例外があってもなくても表示します。---");
    }
  }
}

上記のプログラムを実行した場合の実行結果は、以下のようになります。

sample.txtを読み込みました。
クラス読み込みの例外が発生しました。
java.lang.ClassNotFoundException: sampleClass
---例外があってもなくても表示します。---
ポテパンダの一言メモ

finally必ず使うべき状況

 

  • ファイル接続
  • データベース接続
  • ネットワーク接続

などの後片付け処理は、必ずfinallyブロックに記述しましょう。

try-catch文で例外を発生させる処理は、throwで対応する

JVMに例外的状況を報告することを「例外を投げる」や「例外を送出する」といいます。

例外を投げるためには、throwキーワードを使いましょう。

ポテパンダの一言メモ

JVMとは、正式名称「Java Virtual Machine」で、Javaのプログラムを動かすために必要なソフトウェアのことです。

実際に、例外を投げるプログラムの例を見ていきましょう。

↓Main.java

public class Main{
  public static void main(String[] args){
      Human h = new Human();
      h.setAge(-50);
  }
}

↓Human.java

public class Human{
    int age;
    public void setAge(int age){
        if(age < 0){
            throw new IllegalArgumentException("正の値を指定してください。指定値=" + age);
        }
        this.age = age;
    }
}

HumanクラスのsetAge()メソッドでは、ageが負の値になるのを防ぐために、代入する前に引数の判定をします。

引数が負の値だった場合は、IllegalArgumentExceptionインスタンスを投げ、例外的状況になったことをJVMに報告する、といった流れです。

上記のプログラムを実行した場合の実行結果は、以下のようになります。

Exception in thread "main" java.lang.IllegalArgumentException: 正の値を指定してください。指定値=-50
	at Human.setAge(Human.java:5)
	at Main.main(Main.java:5)

try-catch文でオリジナルの例外クラスを定義する方法

Javaでは、既存の例外クラスを継承して、オリジナルの例外クラスをつくることも可能です。

ここでは、ひとつのオリジナルの例外処理をご紹介します。

↓Main.java

public class Main{
  public static void main(String[] args){
      try{
        // 例外処理を発生させます
        throw new UnsupportedOriginalException("オリジナルの例外処理です。");
      }catch(Exception e){
        System.out.println("例外が発生しました。");
        System.out.println(e);
      }
  }
}

↓UnsupportedOriginalException.java

public class UnsupportedOriginalException extends Exception{
    public UnsupportedOriginalException(String msg){
        super(msg);
    }
}

UnsupportedOriginalExceptionの継承元になるクラスはExceptionになっています。

上記のプログラムを実行した場合の実行結果は、以下のようになります。

例外が発生しました。
UnsupportedOriginalException: オリジナルの例外処理です。

このようにさまざまな例外的状況を想定し、オリジナルの例外クラスとして作成できると、きめ細かいエラーの対処が可能になるでしょう。

まとめ

try-catch文の使い方・書き方についてご紹介しました。

Javaではファイルの読み込む処理を実行する場合、例外処理の記述がないとコンパイルエラーになってしまいます。

ぜひこの記事を参考に、例外処理の使い方をマスターしてください。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。