Murayama blog.

プログラミング教育なブログ

会社組織で学ぶJavaの例外処理入門

Javaの例外処理についてサンプルプログラムを作ってみました。ここでは会社組織のおける部長(GeneralManager)、課長(SectionManager)、一般社員(Employee)クラスを作って組織的に仕事をする様子を実装してみます。

  • GeneralManager
    • 部長クラス。受け取った仕事を課長にお任せ(委譲)する。ただし、課長の対処しきれない仕事はどんな仕事でも片付ける。
  • SectionManager
    • 課長クラス。受け取った仕事を一般社員にお任せ(委譲)する。一般社員が対処しれない仕事に対処するが、それでも無理な仕事は部長にお返しする。
  • Employee
    • 一般社員クラス。受け取った仕事を処理する。無理な仕事は課長にお返しする。
  • Task
    • 仕事を表すクラス。仕事の名前と作業量を保持する。
  • TaskOverException
    • 対処しきれない仕事を表す例外クラス。
  • Main
    • maimメソッドを実装したクラス。

Javaプログラミング

まずは単純なTaskクラス、TaskOverExceptionクラスを作成し、次にEmployee、SectionManager、GeneralManagerクラスを作成します。そのあとMainクラスを作成して動作確認します。

Task

Taskクラスはタスク名と作業量を保持します。

package example;

public class Task {
    private String name;
    private int volume;

    public Task(String name, int volume) {
        this.name = name;
        this.volume = volume;
    }

    public String getName() {
        return name;
    }

    public int getVolume() {
        return volume;
    }
}

TaskOverException

TaskOverExceptionクラスは作業量超過を表す例外クラスです。

package example;

public class TaskOverException extends Exception {
}

Employee

Employeeクラスは作業量が5以下の仕事を処理します。作業量が多すぎる場合はTaskOverExceptionをスローします。

package example;

public class Employee {

    public void execute(Task task) throws TaskOverException {
        if (task.getVolume() <= 5) {
            System.out.println("Employee#execute " + task.getName());
        } else {
            throw new TaskOverException();
        }
    }
}

SectionManager

SectionManagerクラスは、Employeeクラスに処理を移譲します。SectionManagerはTaskOverExceptionを捕捉して処理します。このとき作業量が10以下の仕事を処理可能です。作業量が多すぎる場合はTaskOverExceptionをスローします。

package example;

public class SectionManager {
    private Employee employee;

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }

    public void execute(Task task) throws TaskOverException {
        try {
            employee.execute(task);
        } catch (TaskOverException e) {
            if (task.getVolume() <= 10) {
                System.out.println("SectionManager#execute " + task.getName());
            } else {
                throw e;
            }
        }
    }
}

GeneralManager

GeneralManagerクラスは、SectionManagerクラスに処理を移譲します。GeneralManagerはTaskOverExceptionを捕捉して処理します。

package example;

public class GeneralManager {
    private SectionManager sectionManager;

    public void setSectionManager(SectionManager sectionManager) {
        this.sectionManager = sectionManager;
    }

    public void execute(Task task) {
        try {
            sectionManager.execute(task);
        } catch (TaskOverException e) {
            System.out.println("GeneralManager#execute " + task.getName());
        }
    }
}

Main

Mainクラスにはmainメソッドを実装します。

package example;

public class Main {

    public static void main(String[] args) {
        GeneralManager generalManager = new GeneralManager();
        SectionManager sectionManager = new SectionManager();
        Employee employee = new Employee();

        generalManager.setSectionManager(sectionManager);
        sectionManager.setEmployee(employee);

        Task smallTask = new Task("SmallTask", 1);
        generalManager.execute(smallTask);

        Task mediumTask = new Task("MediumTask", 10);
        generalManager.execute(mediumTask);

        Task largeTask = new Task("LargeTask", 100);
        generalManager.execute(largeTask);
    }
}

実行結果

mainメソッドの実行結果は次のようになります。

Employee#execute SmallTask
SectionManager#execute MediumTask
GeneralManager#execute LargeTask

まとめ

自分で対処できない仕事は上司に報告するようにしましょう。