skillup

技術ブログ

Java

例外処理について

投稿日:

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は存在しません。

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

Exception in thread “main” java.lang.RuntimeException: Uncompilable source code – 例外java.io.FileNotFoundExceptionは報告されません。スローするには、捕捉または宣言する必要があります
at sample.Sample.func0(Sample.java:34)
at sample.Sample.main(Sample.java:23)
Java Result: 1

基本の書き方

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

※以下、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

ポリモフィズム(多態性)とは

Javaでオブジェクト指向の考え方の重要な考え方であるポリモフィズムについて。 Contents1 ポリモフィズムとは?2 ソース ポリモフィズムとは? 日常的に使っていながらいざ説明するとなると困り …

no image

JSF+ajax

JSFでajaxを使うときにいろいろと調べたのでメモ。 やろうとしたことはWEB上で給与明細の計算をしたくて、プルダウンで月の変更したら自動的に経費が該当月に替わるというシステムです。 ajaxを使う …

no image

arquillianでのリソースファイル読み込み

以前、このエントリーでarquillianからライブラリが利用できず、追加のライブラリを導入した、ということを書きました。 実はリソースファイルもそのままですとarquillianからは使用できません …

no image

dbUnitの使い方

えーJavaで有名なテストツールDBUnitについて。 DbUtilではありませんので間違えないように。(私は最初間違えました・・・) まだ全然使い込んでるわけではありませんがどんなことができるかとい …

no image

Javaでのログ出力 基礎編

Javaでのログ出力についてようわかってなかったので基礎から調べました。 Contents1 目的2 設定3 ソース4 出力5 リンク 目的 プログラムの実行過程を把握するため System.out. …