我有许多类型化的异常,它们都具有相同的特征:它们持有状态(int)字段,该字段始终为非零。该代码通常检查状态变量,如果状态变量非零,则抛出相应的异常(取决于上下文)。即:

if (status != 0) throw new AStatusException(status);
... // other context
if (status != 0) throw new BStatusException(status);
... // other context
if (status != 0) throw new CStatusException(status);


大多出于好奇,我想我可能会在基类throwIfNotZero的静态方法StatusException中实现此通用功能,并且让各种A, B, CStatusException类都继承该类。希望这可以使我编写如下代码:

AStatusException.throwIfNonZero(status);
... // other context
BStatusException.throwIfNonZero(status);
... // other context
CStatusException.throwIfNonZero(status);


不幸的是,我得到的最接近的是我在帖子末尾附加的代码,这不是很令人满意。有没有更好的方法可以执行此操作,也许无需使用Reflection和/或避免要求传递看起来多余的类实例(请参见“用法”)?

基本例外

import java.lang.reflect.InvocationTargetException;

public class StatusException extends Exception {
    public int status;
    public StatusException (int status) {
        this.status = status;
    }

    public static <T extends StatusException> void raiseIfNotZero(Class<T> klass, int code) throws T{
        try {
            if (code != 0) throw klass.getConstructor(Integer.TYPE).newInstance(code);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }
    }

}


用法:

AStatusException.raiseIfNotZero(AStatusException.class, status);
BStatusException.raiseIfNotZero(BStatusException.class, status);

最佳答案

您可以在超类StatusException中重载函数raiseIfNotZero()。

并这样称呼它

StatusException.raiseIfNotZero(AStatusException.class, status);
StatusException.raiseIfNotZero(BStatusException.class, status);

10-06 10:07