到目前为止,我认为每个 Java 异常都必须由构造函数在某个地方创建,因为我可以创建自己的自定义异常:
throw new Exception();
但现在看来我必须处理来自 JavaMail 的一些异常 - MessagingException 。它来自方法Store.close
(继承自Service
类)。
我去了那里(我需要检查何时抛出此异常,以便我知道可能出了什么问题),并且我看到此方法调用了其他两个方法 - 它们都没有抛出异常!
public synchronized void close() throws MessagingException {
setConnected(false);
notifyConnectionListeners(ConnectionEvent.CLOSED);
}
据我了解,这是检查异常(既不是错误也不是运行时异常),那么它怎么可能不必在 close
方法命令使用的任何命令中声明它呢?它也不是在此方法中创建的。
最佳答案
声明的异常与该实现可以抛出什么无关,而是与该实现或子类中的实现可以抛出什么有关。 Service
是一个抽象类,JavaMail 实现的两个直接子类(Transport
和 Store
)也是一个抽象类。即使这些都没有覆盖close()
,您使用的具体实现仍然完全有可能覆盖close()
和它的实现可能会抛出MessagingException
。
从 API 设计的角度来看,这有意义吗?我必须更仔细地研究 JavaMail 才能对此做出判断,幸运的是我已经很长时间没有使用 JavaMail 了。
从语言的角度来看,这有意义吗??绝对地。拥有一个不抛出特定检查异常但预计具体子类可能需要抛出异常的实现是完全合理的。
关于java - Java异常从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43998873/