java - 可调用 : why can we "change" the exception on implementation?

标签 java exception

此代码编译时没有错误:

private FutureTask<MessageSource> loadingTask(final Locale locale)
{
    return new FutureTask<MessageSource>(new Callable<MessageSource>()
    {
        @Override
        public MessageSource call()
            throws IOException
        {
            return loader.load(locale);
        }
    });
}

但是Callable接口(interface)定义如下:

public V call()
    throws Exception;

我为什么可以声明我的重写抛出 IOException

注意:我已经通过 Guava 的 CacheLoader 看到并利用了这一点。例如。

最佳答案

简短的回答:您可以这样做,因为 IOException 是一个 Exception

public V call() throws Exception

意味着“这个方法可以抛出一个异常并且没有其他检查异常!”。

如果您现在像这样重写此方法:

public MessageSource call() throws IOException

您实际上是在说“我们可以抛出任何 Exception,但我们自愿将自己限制为一个子集:IOException 及其子项”。

你甚至可以这样做:

public Something call()

根本没有抛出:“我们可以抛出任何异常,但我保证我们根本不会抛出任何已检查的异常!”

关于java - 可调用 : why can we "change" the exception on implementation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16958180/

相关文章:

java - 使用网络代理 (nanoHTTPD) 动态传输[随机访问]加密 (AES-CTR) 视频

java - 如何使用具有预定义 "src"描述符的 Maven 程序集插件制作单个 zip 存档?

django - ImportError : libjpeg. so.8: 无法打开共享对象文件: 没有这样的文件或目录

php - fatal error :未捕获的异常 'Zend_Session_Exception' 带有消息“Zend_Session::start()”

perl - 使用 perl 模块 Log::Syslog::Fast - 无法捕获异常

Java - 想要将整数值类型转换为字节,这样我就可以以二进制格式写入文件

java - Dropwizard Sundial 使用 Hibernate 对象安排任务

java - 为什么使用@PostConstruct?

javascript - 在 Chrome JavaScript 调试器中忽略抛出 $break

java - 运行 GWT 应用程序时出现异常