「例外処理って何?」
「例外処理のやり方がいまいちわからない」
このような悩みを抱えている方は多いのではないでしょうか?
私もJavaを勉強し始めた当初は例外という文字を見るだけで拒否反応が出たものです。
そういった例外処理に苦手意識を持っている方に向けて今回は例外処理とはどういったものなのか?代表的な例外処理にはどういったものがあるのか?といったことについて解説していきます。
例外とは?
まずそもそも例外とは何なのかについて解説していきます。
簡単に言うとエラーのような処理が発生した場合に実行される処理の事です。
もう少し分かりやすく解説しますと、書いたプログラムがすべて想定通りに動くということはなく、どこかでプログラマーが想定した処理とは異なる処理をすることがあります。
そのような時に例外として検出するという機能です。
この例外処理を記入しないとプログラムが途中で止まってしまい最後まで実行されないという大変面倒な事態に陥ってしまう。
しかし例外処理を記載することでプログラム自体を止めることをせずに、「ここでエラーが出てますよ」ということが分かります。
このように例外処理というのはプログラムを組むうえでなくてはならない存在なのです。
例外処理の記載方法
ではそんな必要不可欠な例外処理はどのようにして記載するのでしょうか?
代表的な記載方法としてtry-catch-finallyというものがあり下記のように記載します。
try{
通常の処理
} catch(例外クラス 変数){
例外発生時の処理
} finally {
例外が発生していようが、発生していまいが実行される処理
}
tryブロックの中で実行させる通常の処理を記載し、そこで何か異常が発生した場合にcatchブロック内の処理が実施されます。
そしてfinallyブロックではtryでの例外の発生の有無に関係なく実行される処理となります。
finallyブロックに記載する処理としては、絶対に実行したい処理を記載します。
tryブロックの処理途中で例外が発生した場合tryブロック内に記載しているプログラムの処理は終了され、すぐにcatchブロックに処理が移ります。
そのためtryブロック内で仮にファイルを開けたまま例外が発生して閉じていない、ネットワークの切断をせずにアクセスしたままといった事態が発生してしまいます。
このような事態を想定してfinallyブロックには絶対に実施したい処理を記載しておきます。
try-with-resourcesとは?
先ほどfinallyブロックには絶対に実行したい処理を記載するという解説をしてきました。
しかしこのfinallyブロック記載漏れなどが発生する危険があります。
記載しないからと言って別にコンパイルエラーが発生するわけでないため、記載を忘れることがたまにあります。
そのような問題を解決してくれるものとしてtry-with-resourcesというものがあります。
これはtryブロックで記載したリソースを自動で解除してくれるという優れものです。
try(使用するリソースの作成){
作成したリソースを使用して実行する処理
} catch(例外クラス 変数){
例外発生時の処理
}
記載方法は上記のようになります。
tryブロックの()内にファイルを開いたり、データベースとの接続処理を行うための処理を記載します。
そして例外が発生した場合はcatchブロックに遷移する前にリソースの解放が実施され、そのあとにcatchブロックに処理が移ります。
このようにわざわざ自分でリソースの解放を実施する必要がないためミスがなくなります。
代表的な例外
では次に代表的な例外について紹介していきます。
まず例外には検査例外と非検査例外という2つの例外があります。
また例外以外のトラブルとしてエラーというものも存在します。
エラーはプログラムで対処することができないものや、ハード的な不具合などが原因で発生するものです。
そして検査例外は例外処理を記述した場合にコンパイラが反応してくれる例外の事で、非検査例がはその反対の例外処理を記述してもコンパイラは無反応を貫く例外の事です。
ではそれぞれ代表的なものを紹介していきます。
エラー(Error)
まずエラーですが、代表的なものとしてOutOfMemoryErrorやNoClassDefFoundErrorといったものがあります。
OutOfMemoryErrorは単語からもわかる通り単なるメモリ不足です。
そしてNoClassDefFoundErrorはクラスパスが間違っていた場合等に発生するものとなっています。
検査例外(Exception)
次は検査例外です。
検査例外はIOExceptionやClassNotFoundExceptionといったものが存在します。
IOExceptionは入出力処理を失敗した場合に発生する例外です。
そしてClassNotFoundExceptionはClassやClassLoaderといったクラス定義が見つからなかった場合に発生するもののようです。
非検査例外(RuntimeException)
最後は非検査例外です。
代表的なものとしてNullPointerException、IndexOutOfBoundsExceptionがあります。
NullPointerExceptionは発生頻度が高い例外として有名で、参照がない値にアクセスしようとした場合に発生します。
そしてIndexOutOfBoundsExceptionは配列などで定義したインデックス範囲外を指定した場合に発生する例外となっています。
まとめ
この記事ではJavaの例外に関して解説してきました。
- 例外とは?
- 代表的な例外
例外というのは始めは馴染みのないもので戸惑うかもしれませんが、何度も勉強しているうちにある時急に分かるようになります。
プログラムを書いていくうえで避けては通れないものとなっていますので、ぜひ諦めず勉強し続けていただきたいです。
以上で今回の解説は終了となります。
コメント