/** * ドメイン非依存URL出力フィルタ * javadrill.tech移行時はwp_options.home/siteurlのみ変更すればよい * * データベースには絶対URL(https://minner.asia)を保持し、 * 表示時に現在のドメイン(home_url())に動的変換する */ function javadrill_make_urls_dynamic($content) { if (empty($content)) { return $content; } // データベース内の絶対URLを現在のhome_url()に置換 $old_url = 'https://minner.asia'; $new_url = untrailingslashit(home_url()); // http版も対応(念のため) $content = str_replace($old_url, $new_url, $content); $content = str_replace('http://minner.asia', $new_url, $content); return $content; } // 投稿本文、ウィジェット、タームの説明、抜粋に適用 add_filter('the_content', 'javadrill_make_urls_dynamic', 20); add_filter('widget_text', 'javadrill_make_urls_dynamic', 20); add_filter('term_description', 'javadrill_make_urls_dynamic', 20); add_filter('get_the_excerpt', 'javadrill_make_urls_dynamic', 20); 103「例外修羅道」 | Javaドリル https://minner.asia 楽々学べるJavaの問題集 Fri, 05 Sep 2025 01:55:09 +0000 ja hourly 1 https://wordpress.org/?v=6.8.3 https://minner.asia/wp-content/uploads/2023/10/cropped-logo-32x32.png 103「例外修羅道」 | Javaドリル https://minner.asia 32 32 103 「例外修羅道」 StepFinal 解答例 https://minner.asia/archives/5102 https://minner.asia/archives/5102#respond Sun, 25 May 2025 22:55:57 +0000 http://localhost/?p=5102 ExceptionUtil.java
public class ExceptionUtil {

    public static void processData(String[] inputs) {
        for (String input : inputs) {
            try {
                // 入力を整数に変換
                int value = Integer.parseInt(input);

                // 100をvalueで割って結果を出力
                int result = 100 / value;
                System.out.println("入力 \"" + input + "\" の結果 → " + result);

            } catch (NumberFormatException e) {
                // 数値に変換できなかった場合の処理
                System.out.println("入力 \"" + input + "\" は数値に変換できませんでした");

            } catch (ArithmeticException e) {
                // ゼロによる除算が発生した場合の処理
                System.out.println("入力 \"" + input + "\" はゼロによる除算エラーです");
            }
        }
    }
}

解説:複数処理の個別 try-catch による安全実行

このステップでは、複数の入力に対して、1件ずつ例外処理を行いながら安全に処理を継続するテクニックを学びます。


ポイント1:ループごとに try-catch を分ける

for (String input : inputs) {
    try {
        // 個別の例外処理
    } catch (...) {
        ...
    }
}

このようにすることで、1件で例外が発生しても、他のデータに影響を与えず処理が続行できます。


ポイント2:複数 catch によるエラー分類

  • NumberFormatException → 文字列が整数に変換できない
  • ArithmeticException → ゼロ除算などの算術エラー

適切な例外ごとにメッセージを分けることで、ログやエラー表示がより明確になります。


出力例(テストコードによる結果)

入力 "20" の結果 → 5
入力 "0" はゼロによる除算エラーです
入力 "abc" は数値に変換できませんでした
入力 "10" の結果 → 10

まとめ:このステップで学ぶべきこと

  • 複数の例外が起きうる処理を、1件ずつ安全に実行する構造を作る
  • 処理の途中でエラーがあっても、他の処理を続けることが重要
  • catch を分けて、エラーの種類に応じたメッセージやログを出力する

103 ステップアップ問題 「例外修羅道」


Just Keep Typing, Baby!では、この「例外修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!

// tesh:
// この一歩を踏み外すと、しばらく地獄。今、整地しとけ。

🎯 実習で理解を深めよう

この内容についてJavaDrillで実際に手を動かして学習できます

]]>
https://minner.asia/archives/5102/feed 0
103 「例外修羅道」 StepFinal 問題 https://minner.asia/archives/5098 https://minner.asia/archives/5098#respond Sun, 25 May 2025 22:53:47 +0000 http://localhost/?p=5098 問題

あなたは、複数のデータを処理するユーティリティメソッドを作成しようとしています。
データには不正なものが混じっている可能性があるため、1件ごとに個別の try-catch で例外処理を行い、ログを残しながら全体を安全に処理する必要があります。

以下の仕様に従って処理を実装してください。


要件

  1. メソッド名は processData(String[] inputs) とする
  2. 各 inputs[i] を Integer.parseInt() で整数に変換し、100 / 値 を計算する
  3. 変換できない文字列(例: "abc")や、ゼロ除算が発生する文字列(例: "0")が含まれる
  4. 1件ごとに try-catch で処理し、例外が発生しても他の要素の処理を継続すること
  5. 以下のように出力すること:
  • 正常時:入力 "20" の結果 → 5
  • 変換失敗:入力 "abc" は数値に変換できませんでした
  • ゼロ除算:入力 "0" はゼロによる除算エラーです

テストコード(Main.java)

public class Main {
  public static void main(String[] args) {
    String[] inputs = {"20", "0", "abc", "10"};
    ExceptionUtil.processData(inputs);
  }
}

ヒント

  • 各要素の処理を for 文でループさせる
  • Integer.parseInt() では NumberFormatException が発生することがある
  • 100 / value の除算では ArithmeticException に注意
  • try-catch ã‚’1件ずつ分けて処理すれば、途中でエラーが起きても最後まで処理が続けられる

→ 解答例

103 ステップアップ問題 「例外修羅道」

🎯 実習で理解を深めよう

この内容についてJavaDrillで実際に手を動かして学習できます

]]>
https://minner.asia/archives/5098/feed 0
103 「例外修羅道」 Step09 解答例 https://minner.asia/archives/5094 https://minner.asia/archives/5094#respond Sun, 25 May 2025 22:51:24 +0000 http://localhost/?p=5094 ExceptionUtil.java
public class ExceptionUtil {

    public static void traceError(int[] array, int index, int divisor) {
        try {
            // 指定されたインデックスの値を取り出し、割り算を行う
            int value = array[index];
            int result = value / divisor;
            System.out.println("計算結果: " + result);
        } catch (Exception e) {
            // エラー発生時に詳細情報を出力
            System.out.println("エラーが発生しました");
            System.out.println("原因: " + e.getMessage());
            e.printStackTrace(); // スタックトレースを出力(開発用)
        }
    }
}

解説:例外の原因を追跡する3つの情報

このステップでは、例外が発生したときにその詳細をログ出力する方法を学びます。


1. 固定メッセージ

System.out.println("エラーが発生しました");

ユーザー向けやログ監視用の基本的なアラート表示。


2. getMessage() で原因を要約

System.out.println("原因: " + e.getMessage());
  • / by zero ã‚„ Index 5 out of bounds for length 3 のように、エラーの主な内容を表示
  • ユーザーへの表示や、簡易ログに向いている

3. printStackTrace() で技術者向け詳細ログ

e.printStackTrace();
  • 例外が「どこで発生したか」までわかる
  • 開発中のデバッグや、ログファイルへの出力に有効
  • 本番環境ではログライブラリ(Log4j など)と連携してファイル出力するのが一般的

出力例(エラー時)

エラーが発生しました
原因: / by zero
java.lang.ArithmeticException: / by zero
    at ExceptionUtil.traceError(ExceptionUtil.java:5)
    ...

まとめ:このステップで学ぶべきこと

  • 例外発生時に何が起きたかをユーザーにも開発者にも伝える手段を持つことが重要
  • getMessage() と printStackTrace() を組み合わせて、適切なレベルの情報提供ができるようにする
  • 開発現場では、これらの出力をログファイルに残す設計が基本

103 ステップアップ問題 「例外修羅道」


Just Keep Typing, Baby!では、この「例外修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!

// tesh:
// コードは書けた。でも、それだけで終わっていいのか?

🎯 実習で理解を深めよう

この内容についてJavaDrillで実際に手を動かして学習できます

]]>
https://minner.asia/archives/5094/feed 0
103 「例外修羅道」 Step09 問題 https://minner.asia/archives/5090 https://minner.asia/archives/5090#respond Sun, 25 May 2025 22:48:10 +0000 http://localhost/?p=5090 問題

あなたは、例外が発生したときに、その原因を詳細に調査できるようにログ出力する処理を作成しようとしています。

次の仕様に従って、例外が発生した際に、以下の情報を出力してください:

  1. "エラーが発生しました"(固定メッセージ)
  2. e.getMessage() による例外メッセージ
  3. e.printStackTrace() によるスタックトレース(開発者向けログ)

要件

  • メソッド名は traceError(int[] array, int index, int divisor) とする
  • 配列の要素を取り出し、それを指定された数値で割る
  • インデックスが範囲外、またはゼロ除算が起こりうる
  • 例外が発生した場合、以下の3つを出力すること:
    • "エラーが発生しました"
    • 例外のメッセージ(e.getMessage())
    • 例外のスタックトレース(e.printStackTrace())

テストコード(Main.java)

public class Main {
  public static void main(String[] args) {
    int[] data = {10, 20, 30};
    ExceptionUtil.traceError(data, 1, 5);   // 正常
    ExceptionUtil.traceError(data, 5, 2);   // インデックス範囲外
    ExceptionUtil.traceError(data, 0, 0);   // ゼロ除算
  }
}

ヒント

  • e.getMessage() は例外の簡潔な説明文(1行)を取得する
  • e.printStackTrace() は例外の発生箇所を詳細に出力する(開発用)
  • 本番環境では printStackTrace() の代わりにロガー出力が使われることが多い

→ 解答例

103 ステップアップ問題 「例外修羅道」

🎯 実習で理解を深めよう

この内容についてJavaDrillで実際に手を動かして学習できます

]]>
https://minner.asia/archives/5090/feed 0
103 「例外修羅道」 Step08 解答例 https://minner.asia/archives/5086 https://minner.asia/archives/5086#respond Sun, 25 May 2025 22:45:49 +0000 http://localhost/?p=5086 MyAppException.java
// 独自の例外クラスを定義
public class MyAppException extends Exception {

    // コンストラクタでメッセージを受け取り、親クラスに渡す
    public MyAppException(String message) {
        super(message);
    }
}

ExceptionUtil.java

public class ExceptionUtil {

    public static void checkCode(int code) throws MyAppException {
        if (code == 999) {
            // 条件に合致した場合に独自例外をスロー
            throw new MyAppException("コード999は使用できません");
        }

        // 正常な場合はコードを出力
        System.out.println("コード: " + code);
    }
}

Main.java(再掲)

public class Main {
  public static void main(String[] args) {
    try {
      ExceptionUtil.checkCode(100);  // 正常
      ExceptionUtil.checkCode(999);  // 独自例外をスロー
    } catch (MyAppException e) {
      System.out.println("独自例外発生: " + e.getMessage());
    }
  }
}


解説:独自例外の定義と活用

このステップでは、業務固有の状況を表現するための例外クラスを自分で作る方法を学びます。


独自例外を作る理由

標準の IllegalArgumentException や NullPointerException では表現しきれないような
アプリケーション特有のエラー状態に名前と意味を与えるために、独自例外を定義します。

public class MyAppException extends Exception {
    public MyAppException(String message) {
        super(message);
    }
}

出力例

ExceptionUtil.checkCode(100);
// → コード: 100

ExceptionUtil.checkCode(999);
// → 独自例外発生: コード999は使用できません

補足:throws との併用

MyAppException はチェック例外(Exception のサブクラス)なので、
メソッドシグネチャに throws MyAppException をつける必要があります。


まとめ:このステップで学ぶべきこと

  • Exception を継承すれば、自分だけの例外クラスを定義できる
  • 業務ルールに合った例外を作ることで、コードの意図やエラーの意味が明確になる
  • チェック例外であれば、throws を忘れずに書く必要がある

103 ステップアップ問題 「例外修羅道」


Just Keep Typing, Baby!では、この「例外修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!

// tesh:
// 「え、なんで?」ってなったやろ?それ、ここ。

🎯 実習で理解を深めよう

この内容についてJavaDrillで実際に手を動かして学習できます

]]>
https://minner.asia/archives/5086/feed 0
103 「例外修羅道」 Step08 問題 https://minner.asia/archives/5082 https://minner.asia/archives/5082#respond Sun, 25 May 2025 22:42:55 +0000 http://localhost/?p=5082 問題

あなたは、特定の業務エラーを表すために、独自の例外クラスを作成しようとしています。
次の要件に従って、自作の例外を定義し、それを実際の処理で使ってください。


要件

  1. MyAppException という名前のクラスを定義し、Exception を継承すること
  2. MyAppException はコンストラクタでエラーメッセージを受け取り、super() で親クラスに渡すこと
  3. checkCode(int code) メソッドを作成し、code が 999 の場合に MyAppException を throw すること
  4. 呼び出し元の main メソッドで try-catch を使い、例外を処理して "独自例外発生: (例外メッセージ)" と出力すること
  5. code が 999 でない場合は "コード: (code)" と出力すること

テストコード(Main.java)

public class Main {
  public static void main(String[] args) {
    try {
      ExceptionUtil.checkCode(100);  // 正常
      ExceptionUtil.checkCode(999);  // 独自例外
    } catch (MyAppException e) {
      System.out.println("独自例外発生: " + e.getMessage());
    }
  }
}

ヒント

  • 独自例外は public class MyAppException extends Exception として定義する
  • super("メッセージ") を使えば、Exception クラスにメッセージを渡せる
  • 業務ロジックに応じた意味のある例外クラスを作ると、プログラムが読みやすくなる

→ 解答例

103 ステップアップ問題 「例外修羅道」

🎯 実習で理解を深めよう

この内容についてJavaDrillで実際に手を動かして学習できます

]]>
https://minner.asia/archives/5082/feed 0
103 「例外修羅道」 Step07 解答例 https://minner.asia/archives/5077 https://minner.asia/archives/5077#respond Sun, 25 May 2025 22:40:00 +0000 http://localhost/?p=5077 ExceptionUtil.java
public class ExceptionUtil {

    public static void checkAge(int age) {
        if (age < 0) {
            // 年齢が0未満の場合は、例外を自ら発生させる
            throw new IllegalArgumentException("年齢は0以上でなければなりません");
        }

        // 正常な場合は年齢を出力
        System.out.println("å¹´é½¢: " + age);
    }
}

解説:条件によって throw する例外

このステップでは、不正な入力を検知したら自分で例外を発生させる設計を学びます。


throw は例外を作って投げる

throw new IllegalArgumentException("メッセージ");

この文によって、現在のメソッドの実行を強制的に中断し、呼び出し元に例外を投げることができます。


IllegalArgumentException とは?

  • Javaに標準で用意されている実行時例外(RuntimeException のサブクラス)
  • 「渡された引数が不正ですよ」という意味を持つ
  • 開発現場でも、バリデーションエラーの定番として頻繁に使われる

出力例(テストコードによる結果)

ExceptionUtil.checkAge(25);
// → 年齢: 25

ExceptionUtil.checkAge(-5);
// → エラー: 年齢は0以上でなければなりません

まとめ:このステップで学ぶべきこと

  • throw 文で、プログラムの中から能動的に例外を発生させることができる
  • 不正な状態を例外として扱うことで、堅牢で明快なロジックが書けるようになる
  • 引数チェックや値の制限が必要なときには、IllegalArgumentException を使うのが一般的

103 ステップアップ問題 「例外修羅道」


Just Keep Typing, Baby!では、この「例外修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!

// tesh:
// 今ならまだ笑える。詰まってから読むよりマシ。

🎯 実習で理解を深めよう

この内容についてJavaDrillで実際に手を動かして学習できます

]]>
https://minner.asia/archives/5077/feed 0
103 「例外修羅道」 Step07 問題 https://minner.asia/archives/5073 https://minner.asia/archives/5073#respond Sun, 25 May 2025 22:37:44 +0000 http://localhost/?p=5073 問題

あなたは、ユーザーの年齢を受け取って処理するメソッドを作成しようとしています。
年齢が0未満の値だった場合は、不正な入力として例外を発生させてください。

次の要件に従って実装してください:

  • メソッド checkAge(int age) を作成する
  • age が 0 未満なら、IllegalArgumentException ã‚’ throw して発生させる
  • 呼び出し元で try-catch により例外を処理し、例外が発生したら "エラー: (例外メッセージ)" を出力する
  • 正常な年齢なら "å¹´é½¢: (å¹´é½¢)" を出力する

要件

  • throw new IllegalArgumentException(...) を使って例外を自ら発生させること
  • IllegalArgumentException のコンストラクタに、エラーメッセージを渡すこと
  • 呼び出し側で try-catch により例外を処理すること

テストコード(Main.java)

public class Main {
  public static void main(String[] args) {
    try {
      ExceptionUtil.checkAge(25);   // 正常
      ExceptionUtil.checkAge(-5);   // エラー
    } catch (IllegalArgumentException e) {
      System.out.println("エラー: " + e.getMessage());
    }
  }
}

ヒント

  • throw はメソッドの中で例外を発生させるときに使う
  • IllegalArgumentException は「引数がおかしい」ことを表す標準的な例外クラス
  • 条件分岐で age < 0 のときだけ例外を投げるようにする

→ 解答例

103 ステップアップ問題 「例外修羅道」

🎯 実習で理解を深めよう

この内容についてJavaDrillで実際に手を動かして学習できます

]]>
https://minner.asia/archives/5073/feed 0
103 「例外修羅道」 Step06 解答例 https://minner.asia/archives/5069 https://minner.asia/archives/5069#respond Sun, 25 May 2025 22:35:16 +0000 http://localhost/?p=5069 ExceptionUtil.java
public class ExceptionUtil {

    // このメソッドは例外をスローする可能性があると宣言
    public static void riskyMethod() throws Exception {
        // 明示的に例外を発生させる
        throw new Exception("危険な処理です");
    }
}

Main.java(再掲)

public class Main {
  public static void main(String[] args) {
    try {
      ExceptionUtil.riskyMethod();
    } catch (Exception e) {
      System.out.println("エラーを受け取りました: " + e.getMessage());
    }
  }
}

解説:throws 宣言と throw 文の違い

このステップでは、例外処理の責任を呼び出し元に委ねる設計を学びます。


throws 宣言とは?

メソッドに throws を書くことで、「このメソッドは例外を投げる可能性があります」と呼び出し側に伝えます。

public void method() throws Exception {
    // 例外を投げる可能性がある
}

throw 文とは?

throw は実際に例外を発生させる文です。

throw new Exception("メッセージ");

呼び出し側の責任

throws で宣言されたメソッドを使うときは、呼び出し元で try-catch によって例外を処理する必要があります。
処理しない場合は、さらに上位へ例外を伝播させなければなりません(今回は main で完結)。


出力例

エラーを受け取りました: 危険な処理です

まとめ:このステップで学ぶべきこと

  • throws は「例外が発生しうるメソッドですよ」と呼び出し元に警告する仕組み
  • throw は実際に例外を作って投げる操作
  • 呼び出し側で try-catch することで、安全な例外処理が可能になる

103 ステップアップ問題 「例外修羅道」


Just Keep Typing, Baby!では、この「例外修羅道」でつまづいた人向けの解説をしています。こちらもぜひ!

// tesh:
// 納得したフリは卒業しようぜ。ここで本物の理解を。

🎯 実習で理解を深めよう

この内容についてJavaDrillで実際に手を動かして学習できます

]]>
https://minner.asia/archives/5069/feed 0
103 「例外修羅道」 Step06 問題 https://minner.asia/archives/5064 https://minner.asia/archives/5064#respond Sun, 25 May 2025 22:31:28 +0000 http://localhost/?p=5064 問題

あなたは、ファイルや外部リソースを扱うような処理を想定したメソッドを作成しようとしています。
この処理では例外が発生する可能性があるため、メソッド内で try-catch を使わず、例外を呼び出し元に投げる(throws)形式で設計してください。

次の仕様に従って実装してください:

  • メソッド riskyMethod() は強制的に例外を発生させる(throw new Exception("危険な処理です");)
  • 呼び出し元の main メソッドで try-catch を使って、例外を受け取り処理する
  • 例外が発生したら "エラーを受け取りました: (例外メッセージ)" を出力する

要件

  • riskyMethod メソッドは throws Exception を宣言すること
  • 呼び出し元で try-catch により例外を処理すること
  • System.out.println で例外メッセージを出力すること
  • throw と throws の違いを意識すること

テストコード(Main.java)

public class Main {
  public static void main(String[] args) {
    try {
      ExceptionUtil.riskyMethod();
    } catch (Exception e) {
      System.out.println("エラーを受け取りました: " + e.getMessage());
    }
  }
}

ヒント

  • throw → 例外を発生させる
  • throws → 「このメソッドは例外を投げるかもしれません」と宣言する
  • Exception という親クラスで宣言すれば、あらゆる例外をカバーできる

→ 解答例

103 ステップアップ問題 「例外修羅道」

🎯 実習で理解を深めよう

この内容についてJavaDrillで実際に手を動かして学習できます

]]>
https://minner.asia/archives/5064/feed 0