👋

【Java】Try, Catch, Finally

2023/12/04に公開

概要

例外処理について解説する。例外処理は、try, catch, finallyの3つで構成される。

  • try: 実際に実行したいコードを入れる。この場合は、read()というファイル読み込みが記載されている。
  • catch: 例外処理が記載されている。今回は、FileNotFoundExceptionという、ファイルが見つからなかった場合、そのメッセージを出力するよう記載されている。
  • finally: こちらのブロックは、エラーが発生したとしても、常に実行される。ここでは、catchブロックが例外処理した後に実行されるので、例えば、ファイルを閉じるとか、データベース接続を閉じるといった、クリーンアップ処理が行われることが多い。
try {
    read();
}
catch (FileNotFoundException ex){
    ex.getLocalizedMessage();
}
finally {
}

ハンズオン

今回のハンズオンでは、Phone.javaとPhoneExceptionTester.javaという二つのファイルを使って、例外処理を確認する。

Phone.java

こちらのファイルでは、もしPhoneクラスのphoneTypeもしくはphoneNumberがnullだった場合、「IllegalArgumentException」というエラーが発生することを記載している。その際、"The type and number cannot be null"というメッセージが出力される。

package exceptionExample;

public class Phone {
    private final String phoneType;
    private final String phoneNumber;
    public Phone(String phoneType, String phoneNumber) {
        if (phoneType == null || phoneNumber == null) {
            throw new IllegalArgumentException("The type and number cannot be null");
        }
        this.phoneType = phoneType;
        this.phoneNumber = phoneNumber;
    }
    public String getPhoneType() {
        return phoneType;
    }
    public String getPhoneNumber() {
        return phoneNumber;
    }

    @Override
    public String toString() {
        return "Phone type: " + phoneType + "Phone number: " + phoneNumber;
    }
}

PhoneExceptionTester.java

こちらでは、先ほど定義したPhoneクラスに対して、値を埋め込んでいる。Phoneクラスには、phoneTypeとphoneNumberが必要で、phoneTypeに対しては、"iPhone"。phoneNumberに対しては、["123-4567", null, "234-4567", "345-5678"]という配列から、forループで値が格納される。

一個着目して欲しいのが、nullがあること。このnullについては、Phone.javaで定義したように、「The type and number cannot be null」というメッセージを出して、例外処理をするように設定している。そのため、ターミナルには、下記のように出力される。

二つ目のループにも着目してほしい。二つ目では、ただループを回して、例外処理の設定はしていない。そのため、この場合は単純にエラーを出力して、2番目のnullで処理が止まってしまう。ターミナルには、以下のように出力される。

package exceptionExample;

public class PhoneExceptionTester {
    public static void main(String[] args) {
        String[] numbers = new String[] { "123-4567", null, "234-4567", "345-5678" };
        for (int i = 0; i < numbers.length; i++) {
            try {
                System.out.println(new Phone("iPhone", numbers[i]));
            } catch (IllegalArgumentException ex) {
                System.out.println(ex.getLocalizedMessage());
            }
        }
        for (int i = 0; i < numbers.length; i++) {
            System.out.println(new Phone("iPhone", numbers[i]));
        }
    }
}

Discussion