みなさんこんにちは、かのんです!
昨日に引き続きまして、本日もJavaの復習を行っていきたいと思います!
今日の内容は例外について。
この辺の内容は未だにごちゃごちゃしてしまっているので、一緒に復習していきましょう( ;∀;)!
それでは早速内容に入っていきます!
ざっくり言うと、
コードを書き間違ってしまったり色んな事情でエラーが出てしまった!
→エラーが出たところでプログラムが止まってしまったら困る!
→じゃあエラーが出たときにこういう処理をするよ!っていうのを指定してあげればいいよね!
というものです。
例外処理をする方法は二つあります。
try-catchを使用する方法、throwsを使用する方法です。
では一つずつ見ていきましょう。
基本の書き方は以下となります。
try{
//例外が起こる可能性のある処理
}catch(例外クラス 処理名){
//例外が起こった場合の処理
}
tryの中にある処理をして、例外が起こった場合catchの処理を行う、というものです。
※catchで指定した例外クラス以外のエラーが起こった場合は例外処理がされずそこで止まってしまうので注意
例外が起こらなかった場合はそのままtryの中の処理が行われます。
では実際の例を見ていってみましょう!
try{
int i = 5 / 0;
System.out.println("計算が完了しました 答えは:" + i);
}catch(ArithmeticException a){
System.out.println("例外が発生しました");
}
0で割り算をしようとすると ArithmeticExceptionという例外が発生するので、
それをcatchで受け取って、「例外が発生しました」という文章を表示させます。
2行目の段階で例外が発生しているので「計算が完了しました」という文章は出力されません。
ちなみに以下のようなパターンもあります。(try-catch-finally)
try{
int i = 5/0;
System.out.println("計算が完了しました 答えは:" + i);
}catch(ArithmeticException a){
System.out.println("例外が発生しました");
}finally{
System.out.println("例外処理を終わります");
}
finallyを付けることにより、例外処理をしてもしなくても
毎回処理の最後に行う処理を指定することができます。
上記のコードの場合、「例外処理を終わります」という文章が表示されます。
基本の書き方は以下になります。
例外が発生する可能性のあるメソッド名 (引数) throws 例外クラス名{
//処理
}
こちらは基本的にtry-catchと組み合わせて使う形になります。
try-catchの中でこの書き方をしたメソッドを呼び出し、
もし例外が発生した場合は呼び出し元に戻ってそのままcatchで例外を処理してくれます。
class Sample{
public static void main(String args[]){
try{
test();
}catch(ArithmeticException a){
System.out.println("例外が発生しました");
}
}
public static void int test() throws ArithmeticException{
int i = 5 / 0 ;
System.out.println("計算結果:" + i);
}
}
まずはじめにtryの中でtestメソッドが呼び出されます。
呼び出された先で計算をするのですが0での割り算は出来ないのでArithmeticExceptionが発生します。
メソッドの宣言をする際にthrowsを付けたことによって、
「ArithmeticExceptionが出たら元のメソッドに戻って例外の処理をしてもらってね!」
という処理が行われるので、元のメソッドに戻って例外処理を行います。
結果最終的に「例外が発生しました」という文章が表示されます。
ここでは個人的によく見る例外クラスをまとめていこうと思います。
・ ArrayIndexOutOfBoundsException
配列のindexが存在しない場所を参照しようとした
例:[0,1,2,3]の配列で4を指定しようとした
・ IllegalArgumentException
不正な引数をメソッドに渡そうとした
例:int i という引数のメソッドにString nameを渡そうとした
・NullPointerException
null値の変数を参照しようとした
例外クラスはほかにも沢山あるので、その都度調べて適切なものを使っていけるのがいいかな、と思います。
今までtry-catchはその場で処理を行うので比較的動きも追いやすいのに対して
throwsは動きがあるのでわかりづらいな、と思っていたのですが、
tryの中身が多くなる場合などは別のメソッドに分けて記載したほうがわかりやすいし、
例外が発生した場合に戻ってcatchの処理を行うだけなのでそこまで難しく考えなくてもいいな、と改めて感じました。
それでは今回はこの辺で♪
ありがとうございました!