1. 正しい数字文字列 "42" は 42 にパースされる
  2. 数字でない "xyz" は NumberFormatException となり 0 が返る
  3. 負の数 "-7" もそのままパースできる
  4. 空文字列 "" は NumberFormatException となり 0 が返る
  5. 0 を表す "0" はそのまま 0 が返る
コース一覧
Java 中級:コレクション・Stream・例外処理
throws と例外の伝播

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
Stream API
01. Stream を作る5分
02. filter で絞り込む5分
03. map で変換する5分
04. reduce で集約する5分
05. collect で集める5分
06. sorted で並び替え5分
07. distinct で重複排除5分
08. limit と skip5分
09. 並列ストリーム5分
10. Stream API まとめクイズ5分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ5分

throws と例外の伝播

ここで捕まえても、返す値が決まらない

設定ファイルの 1 行目を読むメソッドを書いているとします。ファイルが無かったときにどうするかは、このメソッドには決められません。画面に「設定を作り直してください」と出すのか、既定値で起動するのか、そのままアプリを終わらせるのかは、呼び出し側の都合だからです。

それでも無理に try-catch で捕まえると、こうなりがちです。

Java

public static String readFirstLine(String path) { try { return Files.readAllLines(Path.of(path)).get(0); } catch (IOException e) { return null; } }

null が返ってきた呼び出し側は、「ファイルが無かった」のか「1 行目が空だった」のかを区別できません。異常が起きたという事実そのものが、ここで消えてしまっています。

例外は、その場で対処できる人のところまで運ぶべきものです。ここでやるべきなのは、捕まえることではなく、捕まえないと宣言することです。

throws で呼び出し元に渡す

メソッド宣言の { の手前に throws と例外の型を書くと、「このメソッドはこの例外を投げるかもしれないので、そちらで面倒を見てほしい」という意思表示になります。

Java

public static String readFirstLine(String path) throws IOException { return Files.readAllLines(Path.of(path)).get(0); }

try-catch が消えて、やりたいことだけが残りました。投げられた例外は、このメソッドを飛び越えて呼び出し元へ伝わっていきます。

受け取った側は、そこで対処するか、さらに上へ渡すかを選べます。どこかで try-catch すればそこで止まり、最後まで誰も捕まえなければ JVM まで届いてプログラムが終わります。

Java

public static void main(String[] args) { try { System.out.println(readFirstLine("config.txt")); } catch (IOException e) { System.out.println("設定ファイルを読めないので既定値で起動します"); } }

対処の内容を知っている場所で対処する。この形にすると、null を返して情報を捨てる必要がなくなります。

書かないとコンパイルが通らない例外がある

IOException を投げるメソッドを呼ぶと、try-catch も throws も書いていない場合にコンパイルエラーになります。「捕まえるか、宣言するか、どちらかを必ず書け」とコンパイラが要求してくるからです。こうした例外を検査例外と呼びます。ファイルやネットワークなど、外の世界の都合で失敗するものが多く含まれます。

一方、NullPointerException や IllegalArgumentException は書かなくても通ります。こちらは非検査例外で、RuntimeException の子孫がこれにあたります。プログラムの書き方そのものが原因で起きるものが多く、毎回宣言させると全メソッドが throws だらけになるので、コンパイラの強制から外されています。

つまり throws は、検査例外を呼び出し元へ渡すための道具です。非検査例外は書かなくても伝わります。

よくある間違い

面倒だからと throws Exception とだけ書いてしまうのは避けてください。呼び出し側は何が飛んでくるのか分からず、結局 catch (Exception e) で丸ごと受けることになります。投げる可能性のある型を、そのまま並べてください。

逆に、非検査例外を throws に書き足すのも意味がありません。コンパイラは何も強制しませんし、読む人の役にも立ちません。伝えたいなら Javadoc に書くほうが親切です。

要件

  1. try ブロックで Integer.parseInt(s) を呼び、成功時はその戻り値を return すること
  2. catch (NumberFormatException e) ブロックで 0 を return すること
  3. メソッドシグネチャは public static int safeParse(String s) のままにし、戻り値の型は int を保つこと

入出力例

safeParse("42") → 42 safeParse("xyz") → 0 safeParse("-7") → -7 safeParse("") → 0 safeParse("0") → 0

ヒント

`Integer.parseInt` は失敗時に `NumberFormatException` を投げる非検査例外メソッドです。`throws` は不要ですが、握らないと例外が上に伝わってしまいます

`try { return Integer.parseInt(s); } catch (NumberFormatException e) { return 0; }` の形に当てはめると簡潔に書けます

`catch` の中で `0` を `return` するパスがあれば、メソッド全体としてどのケースでも必ず `int` が返るので、コンパイルは通ります

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 独自の例外を作る

    Java の例外クラスを継承して独自の `InsufficientFundsException` を作り、銀行口座の出金処理で `throw` / `catch` する流れを学んでみよう。

  • try-with-resources

    AutoCloseable なリソースを安全に扱う try-with-resources 構文を学び、リソースの自動クローズを体験しよう。

  • finally ブロック

    Java の `try` 文で必ず実行される `finally` ブロックの役割をリソース解放や後始末の観点から学び、整数除算の結果を `,end` 付きで返すメソッドを実装してみよう。

  • 例外処理 まとめクイズ

    例外処理 (try-catch / 複数 catch / throws / カスタム例外 / try-with-resources / finally) の総まとめ。検査例外と非検査例外、catch の順序、finally で return など実務頻出のポイントを 4 択クイズで確認する。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • メソッドクラスに属する関数
  • コンパイルソースをバイトコードへ変換する処理
  • ロック「他の人触らないでね」と DB に予約する
  • 戻り値呼び出し元への返答を表す点線矢印
main.java
学習モード
エディタを読み込んでいます

メモ

throws と例外の伝播

⌘S で保存