【发布时间】:2017-05-16 10:26:02
【问题描述】:
到目前为止,我认为每个 Java 异常都必须由构造函数在某处创建,因为我可以自己创建自定义异常:
throw new Exception();
但现在看来我必须处理来自 JavaMail 的一些异常 - MessagingException。它来自方法Store.close(继承自Service类)。
我去了那里(我需要检查什么时候抛出这个异常,这样我才能知道哪里出了问题),我看到这个方法调用了另外两个方法——它们都没有抛出异常!
public synchronized void close() throws MessagingException {
setConnected(false);
notifyConnectionListeners(ConnectionEvent.CLOSED);
}
据我了解,这是已检查异常(既不是错误也不是 RuntimeException),那么close 方法命令使用的任何一个都不必声明它怎么可能?它也不是在这里创建的,在这个方法中。
【问题讨论】:
-
该特定实现不会抛出
MessagingException,但覆盖它的子类可以。 -
@Jon Skeet 可以,但不必...你不觉得现在我必须捕获/抛出不可能发生的异常有点愚蠢吗?而且,如果他们可以抛出这些异常,为什么需要在这个 Service 类中声明呢?留下它并选择性地在覆盖方法中声明不是更好吗?
-
在什么方面是不可能的?是什么让您如此确定您将使用一个不会覆盖它的子类,这意味着异常可以被抛出?所以不,我不认为这很愚蠢。
-
@JonSkeet 我只使用一个子类 - Store。而且我不知道这个 close 方法应该如何为我抛出异常。尽管如此,我还是必须处理这个 Store 类的幻像异常。
-
不,这些方法都不应该抛出该异常。 这个实现不应该抛出那个异常。该异常被声明为允许 子类抛出它。请注意,您也不能直接使用
Store,因为它仍然是一个子类。那么,您对您正在使用Store的哪个子类以及它不会以可能涉及MessagingException被抛出的方式覆盖close有多大把握?
标签: java exception jakarta-mail checked-exceptions