是否可以从assert方法引发自定义异常?

时间:2014-06-13 00:29:36

标签: java assert

我必须验证一个需要大约40个字段的请求。

我想通过避免经典if (field1 == null) throw new XXException("msg");

来做到这一点

例如,我有以下代码:

if (caller == null)
{
    // Caller cannot be empty
    throw new CallerErrorException(new CallerError("", "incorrect caller"));
}
if (person == null)
{
    // Person cannot be empty
    throw new PersonErrorException(new CustomerError("", "incorrect customer"));
}
if (module == null)
{
    // Module cannot be empty
    throw new ModuleErrorException(new ModuleError("", "module must be X"));
}

正如您所看到的,取决于哪个字段为null,将使用自定义消息抛出特定的自定义异常。

所以,我想有这样的事情:

assertNotEquals(call, null, new CallerErrorException(new CallerError("", "incorrect caller")));
assertNotEquals(person, null, new PersonErrorException(new CustomerError("", "incorrect caller")));
assertNotEquals(module , null, new ModuleErrorException(new ModuleError("", "incorrect caller")));

是否有内置功能可以让我这样做?

我知道assertEquals会生成一个assertionError但我需要生成自定义异常。

3 个答案:

答案 0 :(得分:2)

没有任何内置可以为此工作,但你当然可以写自己的:

static void checkNull(Object val, Class exClass, Class innerClass, String arg1, String arg2)
    throws Exception {
    if (val != null) {
        return;
    }
    Object inner = innerClass
        .getDeclaredConstructor(String.class, String.class)
        .newInstance(arg1, arg2);
    throw (Exception)exClass
        .getDeclaredConstructor(innerClass) // This may need to be changed 
        .newInstance(inner);
}

上面的代码使用反射来根据需要构建异常对象。如果内部错误对象的超类与正确的类型匹配,则可能必须更改传递给异常对象的构造函数的类型。

现在您可以按如下方式编写代码:

checkNull(caller, CallerErrorException.class, CallerError.class, "", "incorrect caller");
checkNull(person, PersonErrorException.class, PersonError.class, "", "incorrect person");

这种方法可以避免在不需要抛出异常对象的情况下创建异常对象。

答案 1 :(得分:1)

使用JAVA 8的简单实现

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

class Scratch {
    public static void main(String[] args) {

        List<Integer> inputs = Arrays.asList(1,2,3,4);
        AssertUtils.check(inputs, input -> inputs.contains(5), new RuntimeException("Element 5 doesn't exist"));

        String nullString = null;
        AssertUtils.check(nullString, Objects::nonNull, new RuntimeException("Input is null"));
    }

}

/**
 * Assert to throw Custom exceptions rather than default IllegalArgumentException by {@link
 * org.springframework.util.Assert}. 
 * Usage:
 * AssertUtil.check(input, predicate, customException)
 * Example:
 * List<Integer> inputs = Arrays.asList(1,2,3,4);
        AssertUtils.check(inputs, input -> inputs.contains(5), new RuntimeException("Element 5 doesn't exist"));
 * @param <T>
 */
class AssertUtils<T> {

    public static <T> void check(T input, Predicate<T> predicate, RuntimeException runtimeException) {
        if (!predicate.test(input)) {
            throw runtimeException;
        }
    }
}

答案 2 :(得分:0)

您可以使用自己的功能:

public static <T extends Throwable> void throwIfNotEqual(Object o1, Object o2, T exception) throws T {
    if (o1 != o2) {
        throw exception;
    }
}

更新

如果将此方法与the approach of @dasblinkenlight结合使用,则只有在需要时才能创建异常,并且仍然比“抛出异常”更精确。签名将是:

static <T extends Throwable> void checkNull(Object val, Class<T> exClass, Class innerClass, String arg1, String arg2)
    throws T, ReflectiveOperationException