👋
【Java】Try, Catch, Finally
概要
例外処理について解説する。例外処理は、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