我遇到了一些奇怪的行为,但也许我完全不了解异常处理的工作原理。我有以下代码:
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方法。)
答案 0 :(得分:3)
症状告诉我们init
正在投掷RuntimeException
。由于这不是InvalidKeyException
,因此您的catch
处理程序无法捕获它。
请注意,虽然init
仅记录为InvalidKeyException
,但它 也可以 抛出它喜欢的任何RuntimeException
。 RuntimeException
不必被宣布(或被抓住);它是未经检查的例外,这是它的目的。
虽然您不必抓住它们,但如果您愿意,可以抓住它们。通常这不是一个好习惯(它通常是一个RuntimeException
,但是在有限的情况下捕捉它可能是合适的。