PR

【Java】checked例外とunchecked例外の違いを初心者向けに解説

unDrawのServer Failureイラストを使いchecked例外と例外処理を表すアイキャッチ画像 Java

checked例外は、コンパイラが処理または宣言を求めるかどうかで分かれる例外の分類です。

Javaの例外処理では、同じ例外でも『try-catchしないとコンパイルできないもの』と『必須ではないもの』があります。この差が見えないと、throwsやRuntimeExceptionの説明でつまずきやすくなります。

まずは『checkedは処理か宣言が必要、uncheckedは必須ではない』と覚えると読みやすくなります。

この記事では、checked例外の意味、既存記事との違い、コードの読み方、初心者がつまずきやすい点を順番に整理します。

スポンサーリンク

まず結論:違いは処理を強制されるか

checked例外は、コンパイラが処理漏れを確認する例外です。代表例はIOExceptionです。unchecked例外は、RuntimeException系のように、コンパイラが必須処理を求めない例外です。

次の図では、例外を『処理確認されるかどうか』で分けて見てください。

checked例外をコンパイラ検問でcatchかthrowsを求められるイメージ
checked例外は、コンパイラがcatchするかthrowsで外へ伝えるかを確認する例外です。

この分類が分かると、throwsが必要なコードと不要なコードの違いが見えます。

checked例外とunchecked例外の違い

比較checked例外unchecked例外
処理の強制try-catchかthrowsが必要必須ではない
代表例IOExceptionNullPointerException
主な場面外部要因で失敗し得る処理プログラム上の不備や実行時問題
親クラスExceptionRuntimeException

例外処理の基本が不安な場合は、先にtry-catchの記事を読むと、この分類の意味が分かりやすくなります。

まずはこのコードを読めればOK

ファイル読み込みでは、checked例外であるIOExceptionがよく出てきます。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

static String load(Path path) throws IOException {
    return Files.readString(path);
}

Files.readStringではIOExceptionが発生する可能性があります。この例ではメソッド内でcatchせず、throws IOExceptionで呼び出し側へ伝えています。

try-catchとthrowsの流れ

次の図では、checked例外が出たときの選択肢を確認してください。

checked例外はコンパイラ検問で止まりunchecked例外は必須検問ではないが原因対策が必要なイメージ
checked例外は処理または宣言が必要、unchecked例外はコンパイラ上は必須ではありません。

throwsを見たら、そのメソッドの外側に責任が移っていると読みます。

checked例外では、『この場でcatchする』か『throwsで外へ伝える』かを選ぶ必要があります。throwsは処理済みという意味ではなく、責任を呼び出し側へ渡す宣言です。

初心者がつまずきやすいポイント

つまずきまずこう読む
throwsを書けば解決したと思う処理ではなく外へ伝える宣言
uncheckedは無視してよいと思う必須ではないだけで対策は必要
ExceptionとRuntimeExceptionが混ざるRuntimeException系はunchecked
全部catchすればよいと思う原因に合った処理を考える

最後の図では、unchecked例外を『無視してよい例外』と誤解しないための見方を確認してください。

loadメソッドのthrows IOExceptionが呼び出し側へ責任を渡すことを検問のイメージで示す図
throwsは例外を処理した印ではなく、呼び出し側へ責任を渡す宣言です。

RuntimeException系は、発生してから捕まえるより、発生しにくい設計にすることが重要です。

どちらをどう読めばよいか

  • IOExceptionなど外部要因の失敗を読む
  • NullPointerExceptionなど実行時問題を読む
  • try-catchする場所を判断する
  • throwsで責任を外へ渡すコードを読む

初心者のうちは、例外名を見たらまず『処理を強制される種類か』を確認します。そこからcatchする場所やthrowsの意味を追うと、コード全体の流れが見えます。

次の図では、unchecked例外を『無視してよい例外』と誤解しないための見方を確認してください。

loadからprintFileを通ってmainのcatchまで例外が呼び出し階段を上がるイメージ
例外は、catchされるまで呼び出し元へ渡っていきます。

RuntimeException系は、catchで隠すより、nullや不正値を発生させない設計が重要です。

実務コードで読むときのコツ

実務コードでchecked例外が出てきたら、最初に見るべきなのは『何を扱うために使っているのか』です。クラス名やメソッド名だけを暗記するより、データの目的を日本語に直す方が理解しやすくなります。

次に、変数の型、呼び出しているメソッド、戻り値の3つを順番に確認します。型を見ると入れ物の性質が分かり、メソッドを見ると何をしたいのかが分かり、戻り値を見ると次の処理へどうつながるかが分かります。

この記事の範囲では、checked例外を完全に使いこなすことよりも、初見のコードで立ち止まらないことを優先しています。細かい仕様は公式APIで確認しながら、まずは代表的な使い方を読める状態を作りましょう。

チーム開発では、同じ機能を別の書き方で実現できる場合もあります。そのため『この書き方だけが正解』と覚えるのではなく、なぜその場面でそのクラスや構文が選ばれているのかを考えるのが大切です。

もう1つ大事なのは、サンプルコードと実務コードでは情報量が違うという点です。実務コードでは、変数名、メソッド名、例外処理、戻り値の受け渡しが同時に出てきます。読み始めで混乱したら、まずこのページで扱った最小コードまで戻し、1行ずつ役割を書き出すと整理できます。

特にchecked例外のような基礎概念は、単独で覚えるより、既存記事の文法やクラスライブラリとつなげて読む方が定着します。『どの前提知識が使われているか』を確認する癖をつけると、初めて見るAPIや構文にも対応しやすくなります。

判断に迷ったときの基準

checked例外を使うべきか迷ったときは、先に目的を言葉にしてみます。目的が言葉で説明できないままコードを書き始めると、似たクラスや似た構文との違いが見えなくなります。

確認すること見るポイント
扱いたいデータ値、一覧、例外、日付など何を扱うのか
必要な操作追加、比較、変換、確認、表示など何をしたいのか
既存記事との関係基礎文法、クラス、コレクション、例外処理のどれにつながるか
注意点順番、null、例外、戻り値、不変性など見落としやすい点

この4点を先に確認すると、単なる暗記ではなく、コードを読むための判断軸ができます。初心者向けの記事でも、この判断軸まで持てると、次の応用記事へ進みやすくなります。

練習問題

理解を確認するために、次の観点でサンプルコードを自分で説明してみてください。実行できる環境がある場合は、少し値を変えて結果がどう変わるかも試すと定着しやすくなります。

  • checked例外は何を扱うために使われているか説明する
  • コードの中で一番重要なメソッドを1つ選び、役割を説明する
  • 既存記事で学んだ概念とどこがつながるか説明する
  • 初心者が間違えやすいポイントを1つ挙げ、回避方法を書く

練習では、正確な用語を最初から完璧に使う必要はありません。まずは『何を入れて、何を取り出し、どの条件で動きが変わるのか』を自分の言葉で言えることを目標にしてください。

よくある疑問

最初から細かい仕様まで覚えるべき?

最初からすべてのメソッドや内部仕様を暗記する必要はありません。初心者の段階では、代表的な使い方、よくあるつまずき、既存記事とのつながりを押さえれば十分です。必要になったタイミングで公式APIを確認する習慣を作りましょう。

既存記事とは何が違う?

try-catch、throw/throws、try-with-resources、NullPointerExceptionを接続する例外クラスタの中核補助記事。

次に何を読めばよい?

次に読む記事は、本文末尾の内部リンクから選ぶのがおすすめです。基礎概念が不安なら親記事へ戻り、コードの応用を見たい場合は関連する文法やライブラリの記事へ進むと理解がつながります。

既存記事とあわせて読む順番

try-catchを学んだ後にchecked/uncheckedを押さえ、その次にthrow/throws、try-with-resources、NullPointerExceptionへ進むと、例外クラスタがつながります。

公式情報と関連して読みたい記事

まとめ

checked例外とunchecked例外の違いは、コンパイラが処理または宣言を求めるかどうかです。

  • checked例外は処理または宣言が必要
  • unchecked例外は必須処理を求められない
  • throwsは処理ではなく宣言
  • 必須ではなくても実行時例外の対策は必要

この分類を理解すると、例外処理のコードを『なぜcatchが必要なのか』という視点で読めるようになります。

タイトルとURLをコピーしました