Javaの学習をしていて、例外処理が出てきたのでメモがてらつくってみようとおもいます。
#例外処理とは
例外処理がどういうところで役に立つのかというと、
・処理の最中にサーバーのメモリがオーバーフローした時
・何らかの原因で月末(営業日)にならないと操作してデータを送信できてしまった場合
このように、開発者が想定していないエラーが起きてしまった場合の処理は、書かなければならないのですがそのコードが動く頻度が高いわけではないと思います。
それをメインのコードがおいてあるところにおいておいては、うっかりいじってしまう可能性が高くなってしまいます。
なのでそういったことがないように、例外処理を書いておくクラスを作成しておきます。
そうすることで、上記の例が起きたときに問題を回避することがしやすくなります。
##例外処理のための基礎文法
###try,catch,finallyを使った命令処理について
try{
例外があるか確認したい文;
}
catch (例外クラス1 変数名1){
そして、例外が起きたときに実行する文(1つ目の例外処理が書いてあるクラスを呼び出すことが多い)
}
catch (例外クラス2 変数名2){
もう一つの例外が起きたときに実行する文(二つ目の例外処理を呼び出すもの);
}
これだけ渡されてもなんのことかわからないと思うので、とある有名なサイトからソースコードを引用します。
それが、こちらになります。
class JSample2_1{
public static void main(String args[]){
int n[] = {18, 29, 36};
System.out.println("開始します");
try{
for (int i = 0; i < 4; i++){
System.out.println(n[i]);
}
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("配列の範囲を超えています");
}
System.out.println("終了しました");
}
}
このソースコードの流れとしては、mainメソッドの中にあるint n[]
で数値型の配列を宣言して3つの配列を格納します。
そして、System.out.println("開始します");
で開始のアナウンスをします。
そして、ついにtryのブロックの中に入ります。そしてtryの中でfor文を回します。
このfor文の内容だと、配列の中の値の数が4つ無いといけないのですが最初(int n[]
)で宣言したときは3つしか無いのでエラーが起きます。
もしこの配列の数が4つあればエラーは怒らずこのまま終わるのですが、この場合はArrayIndexOutOfBoundsExceptionというエラーが起きてしまいます。ですが、その場合には「配列の範囲を超えています」というメッセージを出力したい。
そんな場合に、catchコマンドを使うことで解決します。
今回の場合は、エラーが起きてしまうのでcatchコマンドを使ってエラーが起きてしまったときに取るべき処理を書いていきます。
今回はその中身としてSystem.out.println("配列の範囲を超えています");
というメッセージを出力します。
##処理の流れをまとめると
配列を定義して、3つの要素をその中に入れる
↓
開始しますというメッセージを出力
↓
tryのブロックのなかにはいる。
↓
そして、for文で配列の要素数以上の数の要素を細書に定義した配列nから出力させようとする。
↓
エラーが起きるので、catchブロックの中に入れる
↓
そしてそのエラーが起きたときのために書いておいた、`配列の範囲を超えています`というメッセージを出力させるためのコードを実行させる。
というのが主な流れになります。
ただ、ここで一つ問題になってくることがあります。
やっぱりどうやってもcatchで拾いきれない例外というものが出てきてしまうケースがあります。その時は、finallyメソッド
という例外の有無に関わらず実行される命令文を書いておくことで対処します。
ただし、これは例外をcatchできたとしても実行されてしまうので、そこは留意しておいてください。
#検査例外と非検査例外についての説明
検査例外と非検査例外の違いというは、
検査例外 :コンパイラが検査する例外(こんぱいらーが検知してくれる)
非検査例外:コンパイラが検査しない例外(コンパイラーが検知しない)
検査例外の違いはこのようなものですが、わかりやすく言うと
「このJavaのプログラムではどうしようもない外部の事情によってできた例外に対してつかうもの」
ということです。
例えば、何かしらのシステムを作っているとSQLの情報が記述されたファイルが送られてくることもあると思います。しかし、そのときにそのファイルが壊れてしまっていたらどうでしょうか。
当然エラーになってしまいますよね。
ただ、この場合は受取る側のJavaのプログラムには同仕様もありません。
そういったときにtry-catchを使って検査例外として処理させるわけです。
逆に非検査例外についてなのですが、これはtry-catchを強制しないものです。
例えば、先程例として使ったArrayIndexOutOfBoundsExceptionなどのプログラマーが気をつけて対処するタイプの例外に対しては、try-catchは使用しません。
以上になります。
まだまだ語り足りないところがあるかもしれませんが、今回はこれまでにします。
ありがとうございました。
#引用元
以下のリンクからソースコードを引用しました。
https://www.javadrive.jp/start/exception/index2.html