skillup

技術ブログ

Java

例外処理について

投稿日:2015年6月6日 更新日:

Javaの例外処理について書きます。

自分はPHPメインでやってきましたので、この例外についてはうろ覚えでした。

PHPだと例外処理はあるんですが、まああんまり使わなかったり、理解がいい加減でもなんとかなります(笑)

例外とは

Javaでは文法エラーがあった場合にはコンパイル時にエラーになります。

しかし実際にプログラムを走らせたときのエラーに関してはコンパイル時では検知できません。

例としては

  1. 参照すべき配列の要素がない
  2. 参照すべき値がない(NULL)
  3. ファイルを読み込んだのにファイルが存在しない
  4. メモリ不足により実行できない

・・・

などなどです。

このような場合、Javaでは「例外」という事象が発生し、プログラムが強制終了されます。(例外をスローする、という表現をします。)

このままにしておくと、例外がスローされたときに原因追求ができません。

そこで業務ではログに吐いたりして記録を残すことが一般的ですが、今回はとりあえず標準出力に出す、ということにします。

例外の分類

一口に例外といってもプログラマのミスによるものと予測不可能なものがあります。

先ほどの1~4の例で言うと1~3まではプログラマが制御することが可能ですが、4のメモリうんぬんに関してはプログラマ側でどうすることもできません。

この場合の例外処理に関しては任意となっており、例外処理を書かなくても大丈夫です。
(Errorクラスによる例外)

ただし、1~3までは当然プログラマの責任なので例外処理は必須になります。
(Exceptionクラスによるもの)

例外を書かないとき

まずは例外を書かない場合のケースです。

サンプルコードはファイル読込処理を行っていますが、そのファイルが存在せず、IOExceptionという例外が発生するケースを想定します。

Sample.java

実際にはC直下にhogehoge.txtは存在しません。

この場合、実行すると強制終了し、コンソールには下記のようなメッセージが出力されます。

基本の書き方

上記のソースの例外を処理して見ましょう。

※以下、public static void main・・とSampleコンストラクタの部分はほとんど一緒なので省略し、funcの部分だけを記述します。

標準出力に「C:\hogehoge.txt (指定されたファイルが見つかりません。)」というメッセージが出力されます。

下記のように記述することで例外が発生した場合にそれを検知して処理を行うことができます。

また例外を検知する処理を書きながらcatch節に何も書かないことを例外を握りつぶすといい、やってはいけません。

呼び出し元にthrow

上記は実際の発生箇所で例外処理をしていましたが、メソッドなどを記述する場合、呼び出し元に例外処理を送ることもできます。

上記のソースの場合実際に例外が起こるのはsubFunc1ですが、ここで例外処理はしません。

呼び出しもとのfunc3で実際の処理を行いますのでthrows IOExceptionと記述し、try~catchはfunc3に記述します。

オリジナルの例外を作成し、任意のタイミングで投げる

上記の例では全てJava側が自動的に例外を検知し、それをtry~catchで受けるというものでしたが、自分で例外クラスを作成し、任意のタイミングで例外を投げることができます。

Sample.java

SampleException.java

上記の例ではSampleExceptionという例外クラスを作り、任意のタイミングでこのクラスに例外を投げます。

投げているのは

の部分です。throwと書くことで例外を意図的に発生させます。

※他にfinallyなんかの処理もありますが、また別の機会に・・・

-Java
-,

執筆者:


comment

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

関連記事

no image

try~catch~finallyで気を付けること

JavaでExceptionが発生したとき、基本的にはtry~catch~finallyをつかっているのですが、今回Exceptionが吐かれないという事態があったのでメモします。 [crayon-6 …

no image

Fileオブジェクトの操作

業務でテキストファイルを読み込んで、別形式に変換して出力みたいなアプリを作ったときにファイルオブジェクトについていろいろ調べたんでまとめておきます。 Contents1 ファイルオブジェクトとは?2 …

no image

Seleniumの値基本動作まとめ

以前、「Seleniumでの画面テスト」というエントリーでのテストフレームワークとして、Seleniumを紹介しました。 上記のエントリーですが、単なるインストールと基本的な起動、簡単な文字入力ぐらい …

no image

型パラメータに関して その2

Javaでオブジェクト指向に基づいたコーディングをするために必須であり、最初の難関だったのが型パラメータでした。 Contents1 型パラメータが必要なケース2 型パラメータの制限3 クラスインスタ …

no image

依存ライブラリを含むプログラムのjar化に関して

以前、jar化する場合のpomの記述方法について書いたのですが、一部記述が正しくなかったようです。 mavenでのjarファイル作成 この方法でやってもjarファイルを単独で取り出すとNoClassD …

アーカイブ