java - File.toURI().toURL() 怎么会抛出异常?

标签 java url exception

我注意到 File.toURL() 已被弃用,取而代之的是 File.toURI().toURL()。 (我正在使用 Java 8。)

我看到 URI.toURL() 可以抛出 MalformedURLException(扩展 IOException)。

什么情况下File.toURI().toURL()会抛出异常?

最佳答案

从技术上讲这是可能的。例如,考虑这个程序:

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

public class Test {
    public static void main(String[] args) throws MalformedURLException {
        URL.setURLStreamHandlerFactory(protocol -> {
            throw new UnsupportedOperationException();
        });

        System.out.println(new File("/etc/passwd").toURI().toURL());
    }
}

这里 toURL 调用实际上失败了 MalformedURLException:

Exception in thread "main" java.net.MalformedURLException
    at java.net.URL.<init>(URL.java:627)
    at java.net.URL.<init>(URL.java:490)
    at java.net.URL.<init>(URL.java:439)
    at java.net.URI.toURL(URI.java:1089)
    at com.example.Test.main(Test.java:20)
Caused by: java.lang.UnsupportedOperationException
    at com.example.Test.lambda$main$0(Test.java:17)
    at java.net.URL.getURLStreamHandler(URL.java:1142)
    at java.net.URL.<init>(URL.java:599)
    ... 4 more

但是我怀疑如果您设置自定义 URLStreamHandlerFactory 甚至不支持 file 方案,您的程序是否仍能正常运行。

使用默认的 URLStreamHandlerFactory 我想不出或记得 toURL 可能失败的情况,所以如果你不乱用 URLStreamHandlerFactory,你可以安全使用。

如果您需要经常生成 URL 对象,您可以考虑创建一些像这样的实用方法:

public class FileUtils {
    public static URL toURL(File file) {
        try {
            return file.toURI().toURL();
        } catch (MalformedURLException e) {
            throw new InternalError(e);
        }
    }
}

到处使用它。它只是断言 MalformedURLException 在你的程序中是不可能的,所以如果它真的发生了,它会被认为是内部程序错误。

另一种可能性是根本不使用 URL 类。对于许多用途,可以改用 URI 类。

关于java - File.toURI().toURL() 怎么会抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42218058/

相关文章:

Swift - 使用过滤器参数构造 URL

javascript - angularjs 路由器和 jquerys 的 url 片段问题

c# - 从 Linq 查询异常中抛出异常

java - 从Java的多线程并行调用非线程安全的DLL函数

java - 将查询结果转换为对象

php - opencart seo 友好 url 仅适用于某些页面

java - 在哪里处理异常

Java 错误未报告的异常 IOException;必须被捕获或宣布被抛出

java - 两个 fragment ,两个不同的布局,一个 Activity

java - 使用 XSD 中的元素 "anyAttribute"和 "any"将 XML 编码为 Java