我必须验证一个需要大约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但我需要生成自定义异常。
答案 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