异常不会被其捕获块捕获,然后该方法会引发另一种例外



我经历了一些奇怪的行为,但也许我只是不完全了解异常处理的工作方式。我有以下代码:

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

调用后,该方法会引发Runtime Exception,并且控制台输出为:1

(密码对象是类的属性,方法是使用Cipher.getInstance("AES", "BC")的一部分,成功创建了。这是程序失败的INIT方法的文档。)

症状告诉我们init正在抛出RuntimeException。由于那不是InvalidKeyException,因此您的catch处理程序不会捕获它。

请记住,尽管init仅记录在投掷InvalidKeyException,但它也可以也可以投掷任何喜欢的RuntimeExceptionRuntimeException不必声明(或捕获);这是一个未检查的例外,这是它的目的。

尽管您不必抓住它们,但您 can 如果需要的话。通常,这不是一个好的做法(通常是有充分的理由是RuntimeException),但是在有限的情况下,可以捕获它。

最新更新