异常没有被catch块捕获,然后该方法抛出另一种异常

时间:2017-12-07 13:20:33

标签: java exception encryption exception-handling try-catch

我遇到了一些奇怪的行为,但也许我完全不了解异常处理的工作原理。我有以下代码:

public String encrypt(String msg, SecretKeySpec key) throws RuntimeException {

    try {

        System.out.println("1");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        System.out.println("2");

        ...

    } catch (InvalidKeyException e) {
        System.out.println("3");
        throw new RuntimeException("invalid key");
    }

}

在调用时,该方法抛出RuntimeException,控制台输出为:1

(密码对象是该方法所属类的一个属性,并且是使用Cipher.getInstance("AES", "BC")成功创建的。以下是程序失败的the documentation of the init方法。)

1 个答案:

答案 0 :(得分:3)

症状告诉我们init正在投掷RuntimeException。由于这不是InvalidKeyException,因此您的catch处理程序无法捕获它。

请注意,虽然init仅记录为InvalidKeyException,但它 也可以 抛出它喜欢的任何RuntimeExceptionRuntimeException不必被宣布(或被抓住);它是未经检查的例外,这是它的目的。

虽然您不必抓住它们,但如果您愿意,可以抓住它们。通常这不是一个好习惯(它通常是一个RuntimeException,但是在有限的情况下捕捉它可能是合适的。