File.toURI()。toURL()如何抛出异常?

时间:2017-02-14 04:47:27

标签: java url exception

我注意到File.toURL()已被弃用,而不是File.toURI().toURL()。 (我使用的是Java 8。)

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

File.toURI().toURL()可以在什么条件下抛出异常?

1 个答案:

答案 0 :(得分:3)

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

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类。