skillup

技術ブログ

Java

例外処理について その2

投稿日:

以前、「例外処理について」で例外処理について記述をしたんですが、漠然としていたのともう1回まとめなおしたかったため、メモしておきます。

例外とは?

プログラム実行時に発生するエラーのことであり、例外が起こるとプログラムはここでストップ(強制終了)します。

これを適切に行うことを例外処理といいます。

例外のクラス分け

Javaの例外のクラス分けは下記のようになっています。

  • Throwable
    • Error
    • Exception
      • RuntimeException
      • RuntimeException以外

以下、説明していきますね。

Throwable

Javaの全ての例外のスーパークラスです。

後に書きますけどこのクラスを継承したりすることはないですね。私は資格試験で勉強するまでは存在をしりませんでした(汗)

Error

unchecked例外といわれ、例外処理自体は任意になります。

エラーの内容はメモリ不足などプログラマが直接対応するのが困難なエラーが該当します。

一例として下記のようなものがあります。

StackOverFlowError

下記のように呼び出し元と定義が一緒で永久ループなどが発生するケースです。

NoClassDefFoundError

対象のクラスがないときなどに置きます。

コンパイル時にはあるのに、実行時にライブラリがデプロイされていないときなど。

Exception

一般的なプログラマにとっては例外処理というとこちらのほうが一般的でしょう。

この中でも例外チェックが任意となるRuntimeExceptionとそれ以外に分けられます。

RuntimeException

例外処理が任意のものになります。

下記のものが有名です。

ArrayIndexOutOfException

下記のような存在しないインデックスで配列にアクセスをしたときに発生します。

ClassCastException

間違った型変換を行ったときに発生します。

IllegalArgumentException

間違った引数をとったときなどに意図的に投げたりします。

IllegalStateException

オブジェクトのプロパティのチェックなどに使います。参考リンク参照。

NumberFormatException

整数を表さない文字列を整数に変換しようとしたとき。

RuntimeException以外

例外処理が必須となるExceptionです。

下記のものが有名です。

FileNotFoundException

ファイル読み込みなどで該当ファイルがないときにスローされる例外処理です。

 ClassNotFoundException

該当するクラスが存在しているかのチェックです。

ケースとしては間違ったパッケージを読み込んでクラスが存在しない時など。

jarファイルをしっかり読み込んでいるかの確認をしましょう。

実務上の注意点

Throwable,Error,Exceptionクラスを継承しない

Errorクラスはアプリケーションでキャッチされるべきでない重大なエラーであり、プログラマが関与すべきエラーではないため。

またThrowable、Exceptionに関してはこれらを継承するとエラーの意味があいまいになるため。

catch句では必ず例外処理をする

ここで例外を握りつぶすと例外が発生したときなどにどこで例外が起きているかわからなくなります。

Finallyで例外をキャッチしない

ここで例外をキャッチするとcatch句を上書きしてしまうため。

NullPointerExceptionは使わない

if( var != null)やOptionalなど通常の条件分岐などで対処できるため。

Finallyブロックに戻り値に影響のある操作はしない

例としてreturnなど。原則として、ストリームを閉じるなど例外の要件にかかわらず行う処理を記述します。

参考リンク

http://kechanzahorumon.hatenadiary.com/entry/2012/09/21/180147

http://blog.rutake.com/techmemo/2011/10/13/classnotfoundexception%E3%81%AE%E5%8E%9F%E5%9B%A0%E3%81%A8%E5%AF%BE%E7%AD%96/

http://d.hatena.ne.jp/daisuke-m/20081202/1228221927

-Java
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

JavaでのPDF出力

JavaでのPDFファイルをダウンロードしたいと要望があって社内アプリの開発をしていましたが、思った以上にバグがでてかなり長期戦になりました。 やりたいことは ボタンを押すとファイルのダウンロードが始 …

no image

JPAでのリレーション(アノテーション使用)

JPAでリレーションを管理するとき、最初はアノテーションでやろうとしたんですが、結局やり方がわからずコンストラクタ式をかいて対処してました。 JPAでのリレーションに関して 外部キー制約があるやり方は …

no image

Mapからインスタンス変数、インスタンス変数からMapへ

Javaで変数を引き回すときにMapからインスタンス、インスタンスからMap、あるインスタンスから別のインスタンスに変数を差し替える作業って結構多いと思います。 これって普通にやるとMapのget,p …

no image

BeanUtilsについて

以前このエントリーでも紹介しましたが、BeanUtils、思った以上に使い方が幅広いです。 Contents1 クラスからクラスに2 マップからクラスに3 クラスからマップ4 特定の値の取り出し5 リ …

no image

テストコードの実装

以前、テストコードの大切さを力説しましたが、実際に書いてみると作業の安心度が全く違います。 やはりメソッド単位での確認やデバッグができるのは非常にありがたいです。また時間がたってもテストコードを見るこ …