前置き
どのようなプログラムでもそうだが、完璧なプログラムは存在しない。ただし、トラブルが発生したからと言って、ソフトウェアが停止するようなことはあってはならない。トラブルが発生した時、どのように対処すべきかを記述する必要がある。それが、今回説明する例外処理である。
具体的に例外をどのような形で利用するのか
例外処理は以下のように記載する
try{
//例外が発生する可能性がある処理
}catch(例外クラス型 変数){
//例外が発生した時の処理
}finally{
//例外発生の有無にかかわらず実行したい処理
}
例外クラスの種類
IndexOutOfBoundsException
これは存在しない要素にアクセスしようとすると発生する例外クラスである。
import java.util.ArrayList;
import java.util.List;
public class Main{
public static void main(String[] args) {
List<String> list = new ArrayList<>();
try{
list.get(0);
}catch(IndexOutOfBoundsException e) {
System.out.println(e.getMessage());
}
}
}
Index 0 out of bounds for length 0
ArrayIndexOutOfBoundsException
これはIndexOutOfBoundsExceptionと似ているが、存在しない配列の要素にアクセスしようとすると発生する例外クラスである。
public class Main{
public static void main(String[] args) {
try {
int[] array = {};
array[0] = 10;
System.out.println("10を代入");
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println(e.getMessage());
}
}
}
Index 0 out of bounds for length 0
NullPointerException
これは参照型変数にnull値が格納されている時に、参照型変数を参照しようとした場合に発生する例外である。
public class Main{
public static void main(String[] args) {
String a = null;
try{
System.out.println(a.length());
}catch(NullPointerException e) {
System.out.println(e.getMessage());
}
}
}
Cannot invoke "String.length()" because "a" is null
ClassCastException
継承関係や実現関係にないクラスにキャストしようとした場合に発生する例外である。
※AクラスとBクラスには継承関係や実現関係にないとする。
public static void main(String[] args) {
try {
A a = new A(10);
B b = new B(10);
System.out.println(a.equals(b));
}catch(ClassCastException e) {
System.out.println(e.getMessage());
}
}
class test.B cannot be cast to class test.A (test.B and test.A are in unnamed module of loader 'app')
最後に
完璧なプログラムを作成することはほぼ不可能だから、いかに例外処理をうまく使うかが鍵だと感じた。
他にも例外クラスや使い方があるため、今後も学んでいきたい。