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

glassfishへのデプロイ

いつもJavaEE環境のローカル開発ではNetbeansで動かしてますんで、デプロイに関してglassfishのことをほとんど知らなくても動かせます。 開発や本番環境化では当然そういうわけには行かない …

no image

型パラメータに関して

Javaでの型パラメータについて書きたいと思います。 Contents1 基本の型パラメータ2 型パラメータの制限(ある型を継承した場合) 基本の型パラメータ Sample.java [crayon- …

no image

Javaでの文字コード判定、変換

Javaにて文字コード判定の処理を書きます。 Contents1 通常の文字コードの判定、変換2 ファイルの文字コード判定、変換2.1 juniversalchardet2.1.1 ダウンロード2.1 …

no image

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

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

no image

列挙型Enumについて

列挙型のクラスであるEnumについてのメモです。 ちなみにEnumの読み方はイナムまたはイニュームだそうです。 Contents1 列挙型とは?1.1 基本の使い方1.2 key=value的な使い方 …