━目次━
Javaのエラークラスと例外クラスについての記事です。
・ErrorクラスとExceptionクラスの違いを知らない
・Exceptionクラスが検査例外と非検査例外に分かれることを知らない
・検査例外と非検査例外の違いがいまいち分からない
Throwableクラスの図
Javaのエラーや例外に関するクラスは全てThrowableクラス配下にあります。
Throwableクラス配下には、「Errorクラス」と「Exceptionクラス」があり、
Exceptionクラスは更に「Runtime Exceptionクラス系」と「その他のクラス」に分かれます。
ここの「Runtime Exceptionクラス系」の例外を「非検査例外」と呼び、
その他の例外を「検査例外」と呼ぶわけです。
これを図で見てみると下記のようになります。
ではそれぞれのクラスがどう違うのかを見ていきましょう。
Errorクラスとは
プログラムでどうすることもできない事態が起きたときに発生する。
(ex.メモリがオーバーフローしたなど)
プログラムでどうしようもないので、勿論try-catchを実装することは強制されない。
というかJVMでどうしようもないので、catchすること自体無意味。
・StackOverflowError(スタック領域のオーバーフロー)
・OutOfMemoryError(メモリの不足)
・InternalError(内部エラー)
・ClassFormatError(クラスファイルの破損、解釈できない)
・UnknownError(未知の重大なエラー)
非検査例外とは
Runtime Exception配下の例外クラスが対象。
「非」検査例外というだけあって、別にtry-catchで例外ハンドリングする必要はありません。
というか基本的にはすべきではありません。
何故なら非検査例外に当てはまる例外は数多くあり、それらをいちいちtry-catchで囲んでいたら見辛いことこの上ないですし、
非検査例外は正しいプログラムを書くことで回避できるからです。(非検査たる所以)
ちゃんと意識すればNullPointerExceptionなんか防げるもんな
因みにJava以外のほとんどのプログラミング言語で扱う例外は全てこの非検査例外としています。
・NullPointerException(ぬるぽ)
・ArrayIndexOutOfBoundsException(配列で存在しない要素へのアクセス)
・IllegalArgumentException(不正な引数をメソッドに渡した)
・ArithmeticException(算術例外)
・ClassCastException(継承関係のないクラスへのキャスト)
・NegativeArraySizeException(負の値を配列のサイズに指定)
・SecurityException(セキュリティ違反)
・TypeNotPresentException(型定義が未存在)
・UnsupportedOperationException(サポートされていないような操作)
検査例外とは
Exceptionクラス配下のRuntime Exception以外のクラスが対象。
Javaがコンパイル時に検査を行う例外なので、try-catchで例外ハンドリングを行わないといけない。
何故このような仕様になっているかというと、検査例外は基本的に正しいプログラムを書いていても避けられない例外だからです。
例えば、ファイルが壊れたりしているとIOExceptionが起きますが、どれだけ頑張ってプログラムを書いてもファイルが壊れていたら防ぎようがありません。
同様にDB障害などでSQLExceptionが発生するのもプログラムではどうしようもありません。
そういった例外たちを集めて、「お前らがハンドリングを忘れないようにtry-catchの記述を強制させてやるぜ~」ってJavaがドヤ顔しているのが検査例外だと思えば良いでしょう。
・IOException(入出力関係の例外)
・SQLException(DB系の例外)
・ClassNotFoundException(クラスが見つからない)
・InstantiationException(インスタンス化不可のクラスをnewした時)
・InterruptedException(スレッドへの割り込み)
・NoSuchFieldException(クラスに要求したフィールドがない)
・NoSuchMethodException(クラスに要求したメソッドがない)
さいごに
「検査例外」というJava独自の仕様を便利と思うか、大きなお世話と思うかは人それぞれだと思います…
ただ個人的意見では「とりあえずエラーがおきそうなとこはtry-catch」くらいの認識でいる開発者もいますし、
try-catchを強制することで入れ子になった処理において例外が握りつぶされたりすることもあるので、
他の言語が全く採用してないことを見てもどうかなと思う部分があります。
そもそもこの例外の種類をちゃんと理解してプログラムを組んでいる人がどれだけいるかも疑問ですね
(以前までの自分も含む)
それでは!また!!
人気の記事だけ集めたので是非覗いていってください^^
厳選!目的別にオススメ記事を紹介-あなたの欲しい情報がここに-