【新人エンジニア向け】Javaのチェック例外 vs 非チェック例外 〜throwsの必要性を完全整理!〜
こんにちは。ゆうせいです。
Javaにおける「例外」は、ただのエラーではなく、きちんと分類された仕組みなんです。
特に重要なのが「チェック例外」と「非チェック例外(実行時例外)」の違い。
この違いを理解していないと、「なんでコンパイル通らないの?」とか、
「throws
って書いたり書かなかったり…どっちなの?」と悩むことになります。
この記事では、新人エンジニアが混乱しやすい「throws
の要・不要の違い」を中心に、
やさしく・確実に理解できるように解説します!
まずは用語整理:チェック例外と非チェック例外とは?
チェック例外(Checked Exception)
- コンパイル時にチェックされる例外
- 開発者が 必ず処理(または宣言)しなければいけない
- 例:
IOException
(ファイル操作失敗)SQLException
(データベース操作の失敗)
public void readFile(String path) throws IOException {
FileReader reader = new FileReader(path);
}
このように throws IOException
を書かないとコンパイルエラーになります。
非チェック例外(Unchecked Exception)
- 実行時にだけ発生する例外
throws
の記述が不要- 主に「プログラムのバグ」が原因
- 例:
NullPointerException
IllegalArgumentException
ArrayIndexOutOfBoundsException
public void validateAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("年齢は0以上である必要があります");
}
}
上記では throws IllegalArgumentException
を書かなくてもOK!
throws
キーワードの必要性まとめ
チェック例外(Checked Exception)
throws
の記述:必須- 理由: 呼び出し元が確実にエラー対処できるように強制するため
// 呼び出し元でtry-catch or throws必須
try {
readFile("data.txt");
} catch (IOException e) {
e.printStackTrace();
}
非チェック例外(Unchecked Exception)
throws
の記述:任意(省略可能)- 理由: Java側で開発者の責任で処理しろというスタンス
// throws無しでOK
public void doSomething(String input) {
if (input == null) {
throw new NullPointerException("引数がnullです");
}
}
表で比較しよう!
比較項目 | チェック例外(Checked) | 非チェック例外(Unchecked) |
---|---|---|
基底クラス | Exception (ただし RuntimeException を除く) | RuntimeException のサブクラス |
throws の必要性 | 必要(書かないとコンパイルエラー) | 不要(書いてもOK、書かなくてもOK) |
処理の義務 | 呼び出し側にtry-catch or throwsを強制 | 処理しなくてもコンパイルは通る |
よくある用途 | 外部とのやり取り(IO, DB)など | プログラミングミスや設計ミスの検出 |
実例で理解!コード比較
チェック例外の例(ファイル操作)
public void loadData() throws IOException {
BufferedReader reader = new BufferedReader(new FileReader("data.txt"));
}
呼び出し元では必ずこうしないとダメ:
try {
loadData();
} catch (IOException e) {
e.printStackTrace();
}
非チェック例外の例(引数チェック)
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("年齢は0以上にしてください");
}
}
呼び出し元は例外を受け取らなくても動作します。
なぜJavaは2種類に分けたのか?
チェック例外の目的:
「これは予測できるエラーだから、必ず対処してください」
→ ファイルが存在しない、DB接続が切れた…など、外部要因が原因のケース。
非チェック例外の目的:
「これはプログラマのミスだから、事前に気をつけて設計してね」
→ 配列の範囲ミス、nullアクセスなど。try-catchより防止設計が大事!
結論とアドバイス(新人向け)
- 「throws が必要か?」と迷ったら、それが「外部要因のエラー」か「プログラムのミス」**かで考えよう!
- コンパイル時にエラーが出る → チェック例外。ちゃんと
throws
ortry-catch
を書く。 throws
が不要でも、設計として意図を明示したいときはあえて書くのもアリ!
次に学ぶとよいテーマ
Exception
とError
の違いRuntimeException
を使った設計方針の善し悪しtry-with-resources
での自動クローズと例外処理の両立
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
