java - Java异常从何而来?

标签 java exception jakarta-mail checked-exceptions

到目前为止,我认为每个 Java 异常都必须由构造函数在某个地方创建,因为我可以创建自己的自定义异常:

throw new Exception();

但现在看来我必须处理来自 JavaMail 的一些异常 - MessagingException 。它来自方法Store.close(继承自Service类)。

我去了那里(我需要检查何时抛出此异常,以便我知道可能出了什么问题),并且我看到此方法调用了其他两个方法 - 它们都没有抛出异常!

public synchronized void close() throws MessagingException {
    setConnected(false);
    notifyConnectionListeners(ConnectionEvent.CLOSED);
}

据我了解,这是检查异常(既不是错误也不是运行时异常),那么它怎么可能不必在 close 方法命令使用的任何命令中声明它呢?它也不是在此方法中创建的。

最佳答案

声明的异常与该实现可以抛出什么无关,而是与该实现或子类中的实现可以抛出什么有关。 Service 是一个抽象类,JavaMail 实现的两个直接子类(TransportStore)也是一个抽象类。即使这些都没有覆盖close(),您使用的具体实现仍然完全有可能覆盖close()它的实现可能会抛出MessagingException

从 API 设计的角度来看,这有意义吗?我必须更仔细地研究 JavaMail 才能对此做出判断,幸运的是我已经很长时间没有使用 JavaMail 了。

从语言的角度来看,这有意义吗??绝对地。拥有一个不抛出特定检查异常但预计具体子类可能需要抛出异常的实现是完全合理的。

关于java - Java异常从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43998873/

相关文章:

java - ArrayList 上的同步

java - 捕获 Spark 驱动程序上的 Dataset foreachPartition() 函数中抛出的异常?

javascript - handlebars 2.0 运行时出现未知模板对象错误

Java SimpleDateFormat 在不同操作系统上对 'z' 的解释不同

java - 邮件发送异常 : Failed messages: com. sun.mail.smtp.SMTPSendFailedException

java - 获取明天的时间 xx :xx

java - 如何将带有 mongoDB 项目的 spring 4 + Hibernate 切换到 MySQL?

c++ - 与 C++ Exception throw 语句混淆

java电子邮件附件在正文中以纯文本形式发送

java - 如何在创建 jar 文件时包含库文件而不单独复制库