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

JSFのテンプレート機能

Contents1 保守性の向上で必要なHTMLの考え方1.1 サンプル1.2 ファイル構成1.3 ソース1.3.1 静的なファイル群1.3.2 テンプレート1.3.3 アクセスファイル1.4 Net …

no image

GlassFish&Junitの不具合

JavaEE(JSF+JavaBean+EJB+JTA)でアプリを製作しているのですが、EJBの部分のjunitができないことが判明しました。 正確に言うとラムダ式を使うと不具合がでます。原因としては …

no image

Enumでメソッドの実装

以前、Enum式で値を定義したことはありましたが、なんとメソッドが実装できることを知りました。 Contents1 Enumでのメソッドを実装2 複雑なメソッドの実装 Enumでのメソッドを実装 op …

no image

データベース文字コード対策他

Contents1 JDBC文字化け対策2 BigDecimal2.1 ソース2.2 参考リンク3 CreateQuery4 jsfのconvertNumber JDBC文字化け対策 データベースがu …

no image

型情報の取得・活用について

Javaで抽象度の高い実装を行うときに必要となる型情報の活用法について。 できるとできないとでプログラムの応用範囲が変わってくるのでメモっときます。 こちらのエントリーと合わせて読むといいと思います。 …

アーカイブ