如何在布尔方法中抛出三个异常?

时间:2018-03-26 13:16:04

标签: java exception try-catch

我是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");
        }
    }

4 个答案:

答案 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);。这就是为什么你不能从你的实现中抛出一个检查过的例外的原因 - 你会违反界面。否则,如果你在一个没有实现任何接口的类中实现一个方法,或者实现一些你可以改变的接口,你就能够改变方法签名并随意抛出异常。