Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの検査例外(Checked Exception)と非検査例外(Unchecked Exception)の違いを徹底解説

この記事では、Javaにおける検査例外(Checked Exception/チェックされる例外)非検査例外(Unchecked Exception/チェックされない例外)の違いについて、それぞれの特徴や具体例を交えながら詳しく解説します。

検査例外(Checked Exceptions)とは

検査例外は、コンパイル時に発生・検出される例外です。主な特徴は以下のとおりです。

  • コンパイル時に発生する例外であり、コンパイラがその存在を厳密にチェックします。

  • コンパイルの段階で、あらかじめ例外への対応(try-catchによる捕捉やthrows宣言)を行うことができます。

  • Exceptionクラスのサブクラスとして定義されています(ただしRuntimeExceptionクラスは除きます)。

  • JVMは、この種の例外を必ず捕捉して適切に処理することを要求します。未処理のままではコンパイルエラーになります。

  • 代表例:FileNotFoundException(ファイルが見つからない例外)、IOException(入出力エラー)、SQLException(データベース操作エラー)など。

非検査例外(Unchecked Exceptions)とは

非検査例外は、プログラムの実行時(ランタイム)に発生する例外です。主な特徴は以下のとおりです。

  • 実行時に発生するため、コンパイラはこの種の例外をチェックしません。

  • コンパイルの時点で捕捉・対応することはできません。

  • 多くの場合、プログラマ側のコードのミス(バグ)が原因で発生します。

  • RuntimeExceptionクラスおよびそのサブクラスに分類され、通常のExceptionクラスの継承体系とは扱いが異なります。

  • JVMは、この例外を捕捉して処理することを要求しません。開発者の判断に委ねられます。

  • 代表例:NoSuchElementException(要素が存在しない例外)、NullPointerException(null参照)、ArrayIndexOutOfBoundsException(配列の範囲外アクセス)、ArithmeticException(ゼロ除算など算術エラー)など。

まとめ:両者の違い一覧

比較項目検査例外非検査例外
発生タイミングコンパイル時実行時(ランタイム)
コンパイラによるチェックありなし
継承元Exceptionクラス(RuntimeExceptionを除く)RuntimeExceptionクラス
JVMによる処理要求捕捉・処理が必須捕捉・処理は任意
主な原因外部環境の問題(ファイル不在など)プログラムのバグ

このように、検査例外は「事前に必ず対処すべき外部要因の問題」、非検査例外は「実行時に明らかになるプログラム側の不具合」という位置づけで使い分けられています。適切な例外処理を設計することで、より堅牢なJavaアプリケーションを構築できます。

  1. JavaのIteratorとEnumerationの違いを徹底比較!使い分けのポイントを解説

    はじめに:IteratorとEnumerationとはJavaのコレクションフレームワークには、コレクション内の要素を順番に走査(トラバース)しながらアクセスするための仕組みとして「カーソル」が用意されています。その代表格が Iterator(イテレータ) と Enumeration(列挙) の2つです。両者はどちらもコレクションフレームワークに属しますが、登場した時期と役割が異なります。EnumerationはJDK 1.0から存在する歴史あるインターフェースで、IteratorはJDK 1.2でコレクションフレームワークとともに導入された、より新しいインターフェースです。Enumerati

  2. JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介

    HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って