我经历了一些奇怪的行为,但也许我只是不完全了解异常处理的工作方式。我有以下代码:
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
,但它也可以也可以投掷任何喜欢的RuntimeException
。RuntimeException
不必声明(或捕获);这是一个未检查的例外,这是它的目的。
尽管您不必抓住它们,但您 can 如果需要的话。通常,这不是一个好的做法(通常是有充分的理由是RuntimeException
),但是在有限的情况下,可以捕获它。