我是Java World的新手,我正在尝试理解异常,但我没有得到的是; 如何在布尔方法中抛出异常? 当我必须在一个捕获中使用三个异常时该怎么办?
@Override
public boolean isValid(Object bean, ConstraintValidatorContext ctx) {
try {
if (Assert.isNull(bean)) {
logger.info(EXC_MSG_BEAN_NULL, bean.toString());
}
String dependentFieldActualValue;
dependentFieldActualValue = BeanUtils.getProperty(bean, dependentField);
boolean isActualEqual = stringEquals(dependentFieldValue, dependentFieldActualValue);
if (isActualEqual == ifInequalThenValidate) {
return true;
}
return isTargetValid(bean, ctx);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
logger.info("Necessary attributes can't be accessed: {}", e.getMessage());
//I cant throw an exception here...
}
}
或者我可以这样做,但它也没有帮助我:我不知道如何在布尔方法中使用异常。
@Override
public boolean isValid(Object bean, ConstraintValidatorContext ctx) {
try {
if (Assert.isNull(bean)) {
logger.info(EXC_MSG_BEAN_NULL, bean.toString());
}
String dependentFieldActualValue;
dependentFieldActualValue = BeanUtils.getProperty(bean, dependentField);
boolean isActualEqual = stringEquals(dependentFieldValue, dependentFieldActualValue);
if (isActualEqual == ifInequalThenValidate) {
return true;
}
return isTargetValid(bean, ctx);
} catch (ReflectiveOperationException e) {
logger.info("Necessary attributes can't be accessed: {}", e.getMessage());
//Here should be my throw new ReflectiveOperationException("ERROR");
}
}
答案 0 :(得分:1)
您不能在指定的位置抛出异常,因为方法isValid
不包含签名中的任何异常。出于教学目的,让我们定义一个自定义异常类型:
static class MyException extends Exception {
public MyException(Exception e) {
super(e);
}
}
然后我们可以将throws MyException
添加到isValid
的方法签名中,并将其实际投放到multi-catch
中。像,
@Override
public boolean isValid(Object bean, ConstraintValidatorContext ctx) throws MyException {
try {
// ...
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
logger.info("Necessary attributes can't be accessed: {}", e.getMessage());
throw new MyException(e);
}
}
如果您希望这些特定的例外情况返回调用堆栈 - 只需将它们添加到投掷行并删除try-catch
(或重新投入try-catch
如果你 真的 想出于某种原因想登录这里。)
@Override
public boolean isValid(Object bean, ConstraintValidatorContext ctx)
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
// No try-catch. Otherwise the same.
}
答案 1 :(得分:1)
有两种方法可以处理异常:
据我所知,你不能在那里抛出异常因为你的方法不允许抛出异常,所以你应该处理这个方法中所有已检查的异常。或者您可以添加关键字“throws”:
isValid(...) throws NoSuchMethodException {
...
throw e;
}
这将允许您抛出类NoSuchMethodException的异常。
答案 2 :(得分:0)
你只想捕获你期望的三个异常,但是在java中,你没有捕获或抛出它的任何异常,java应用程序都会崩溃。你这样做是无稽之谈
答案 3 :(得分:0)
这里的问题是您的班级正在实施javax.validation.ConstraintValidator
。方法isValid
的签名在该接口中定义为boolean isValid(T value, ConstraintValidatorContext context);
。这就是为什么你不能从你的实现中抛出一个检查过的例外的原因 - 你会违反界面。否则,如果你在一个没有实现任何接口的类中实现一个方法,或者实现一些你可以改变的接口,你就能够改变方法签名并随意抛出异常。